Home    PHP Temple    MySQL Treasure




C 語言    傳址呼叫法(call by address)and傳值(call by value)

C語言 by wikipedia

C,是一種通用的程式設計語言,它主要用來進行系統程式設計。具有高效、靈活、功能豐富、表達力強和移植性好等的特點,在程式員中備受青睞。
C語言是由UNIX的研製者丹尼斯·里奇(Dennis Ritchie)和肯·湯普遜(Ken Thompson)於1970年研製出的B語言的基礎上發展和完善起來的。C語言可以廣泛應用於不同的操作系統,例如UNIX、MS-DOS、Microsoft Windows及Linux等。C語言是一種面向過程的語言,同時具有高級語言和彙編語言的優點。在C語言的基礎上發展起來的有支持多種程式設計風格的C++語言,網路上廣泛使用的Java、JavaScript,微軟的C#等。

& 和  * 是C 語言 最重要也最复杂

指標(pointer)指针:
C 語言提供了指標資料型態。指標變數 是用來存放變數的位址 (address),是C语言中最有特色的部
分。
指针变量同普通变量一样,使用之前不仅要定义说明, 而且必须赋予具体的值。未经赋值的指针变量不能使用,否则将造成系统混乱,甚至当机crush。
初始化的 語法:

int  *pA ;   /* pA 代表一個指向 整數值 之指標 pA is a pointer to an interger variable */
char  *c ;   /*    c 代表一個指向 字符值 之指標 c is a pointer to a character variable */
float  *p ;    / *  p 是指向 浮点变量 的指针变量 p is pointer to float variable * /



在许多语言中电脑的记忆体位址 你看不到 管不到,但在C语言中 记忆体位址却可用 & 输出,来满足你的好奇心

右图 记忆体位址用16进制表示 0x00f4............0x00f8

int a;
int *pA;

a = 5;     /*   如右图 把 5 放入 a 中    */
pA = &a;    /*    把 a 的位址(0x00f4)放入 pA 中    */

记忆体位址 0x00f4 会因你的电脑而不同,

右图 %P表示输出用16进制,也可以用%d就会输出10进制

以下几张图只是配合例子而改变记忆体位址编号,事实 记忆体位址是不变的,变的只是 变量variable

#include  <stdio.h>
int main(void)
{
  int a;    /*    declare function     */
  int *pA;
  
  a = 5;
  pA = &a;
  
  printf(变数a的值为%d \n", a);        /* 输出: 变数a的值为 5  */
  printf(变数a的位址为%p \n", &a);     /* 输出: 变数a的位址为 0x00f4 */
  printf(指针pA的值为%p \n", pA);      /* 输出: 指针pA的值为 0x00f4 */
  printf(*pA的值为%d \n", *pA);       /* 输出:  *pA的值为 5       */
  
  return 0 ;
}

#include <stdio.h>

int main(void)
{
int a, b;
int *pA ;
a = 5;
b = 10;
pA = &a; /*变量a 的位址给 pA */
printf("变量a的值为 %d \n",a);
printf("指针pA的值为 %p \n",pA);
printf("*pA的值为 %d \n",*pA);

pA = &b; /*变量b 的位址给 pA */
printf("变量b的值为 %d \n",b);
printf("指针pA的值为 %p \n",pA);
printf("*pA的值为 %d \n",*pA);
return 0;
}

执行结果:
变量a的值为5
指针pA的值为 FFD8
*pA的值为5
变量b的值为10
指针pA的值为 FFDA
*pA的值为10

 

#include <stdio.h >
void milk(int);
int main(void)
{
  int pooh = 2, bah = 5;
  
  printf("In main(), pooh = %d and &pooh = %p\n", pooh, &pooh);
  printf("In main(), bah = %d and &bah = %p\n", bah, &bah);
  milk(pooh);
  return 0;
  }
void  milk(int bah)
{
  int pooh = 10;
  printf("In milk(), pooh = %d and &pooh = %p\n", pooh, &pooh);
  printf("In milk(), bah = %d and &bah = %p\n", bah, &bah);
}

输出:
In main(), pooh = 2 and &pooh = FFD8
In main(), bah= 5 and &bah = FFDA
In milk(), pooh = 10 and &pooh = FFD0
In milk(), bah = 2 and &bah = FFD6

呼叫 milk(pooh); 确实将 实际引数main的 pooh的 2 传给 milk() 的 bah(形式引数)
但由输出结果 可看出 记忆体位址都不同,虽然同是pooh或都是bah,但在电脑是4个不同变量
Notice: this is pass by value
关於每一函数各有自己的变量,再用以下的例子说明

#include <stdio.h>  /* 以下例子出自The Waite Group's New C Primer Plus松岗出版 */
void interchange(int u, int v); /* declare function */
int main(void)
{
  int x = 5, y = 10;
 
 printf("Originally x =%d and y = %d.\n", x, y);
 interchange(x, y);  
 printf("Now x = %d and y = %d.\n",x, y);
 return 0;
}
              /* --------   交換x y      傳值程序    ------ */           
void interchange(int u, int v) /*  define function  */
{
  int temp;
  
  temp = u;
  u = v;
  v = temp;
}
执行结果:
Originally x = 5 and y = 10.
Now x = 5 and y = 10.   /* 结果竟然没换过来  */

让我们在interchange()中加入printf 看看问题出在那里

#include <stdio.h>
void interchange(int u, int v); /* declare function */
int main(void)
{
 int x = 5, y = 10;
 
 printf("Originally x =%d and y = %d.\n", x, y);
 interchange(x, y);
 printf("Now x = %d and y = %d.\n",x, y);
 return 0;
}
void interchange(int u, int v)   /*  define function  */
{
  int temp;
  printf("原来的 u = %d and v = %d.\n", u, v);
  temp = u;   /*  此變數與 main函數的變數 x y 不同, */
  u = v;      /*  此interchange函數的變數為local variable  */
  v = temp;   /*  local variable 生命週期始于interchange函數開始,結束于interchange函數終點 */     
  printf("现在 u = %d and v = %d.\n", u, v);
}
执行结果:
Originally x = 5 and y = 10.
原来的 u = 5 and v = 10.
现在 u = 10 and v = 5.
Now x = 5 and y = 10.  
每一函数各有自己的变量,interchange()的变量和main()的变量不一样
#include <stdio.h>
void interchange(int *u, int *v); 
int main(void)
{
  int x = 5, y = 10;
 
 printf("Originally x =%d and y = %d.\n", x, y);
 interchange(&x, &y);  /*  send address to function 傳址 pass by reference  */
 printf("Now x = %d and y = %d.\n",x, y);
 return 0;
}
              /* --------   交換x y      傳址程序    ------ */

void interchange(int *u, int *v) 
{
  int temp;
              /* u的值是&x ,所以  u指向x,因此*u为x的值  */
  temp = *u;  /* 不要写成temp = u ,这意义就成了:将x的位址给temp,而非x的值 给temp */
  *u = *v;    /*   *u = *v 等於 x = y     u = v 等於 &x = &y  */
  *v = temp;
}
执行结果:
Originally x = 5 and y = 10.
Now x = 10 and y = 5.   /* 成功了  */

懂了吗 ?

你已学会 在C语言中 最复杂的部分, 其他的就容易, 你就能满有信心 去完成

Good   luck ,  Go for it............................ maybe take years.

其实学PHP语言 不难 只是付上的代价不是几个月,而是年s



·C语言笔记 第一章 指针的概念

由于C语言中字符常量是按整数(short型)存储的,所以字符常量可以像整数一样在程序中参与相关的运算。例如:
'a'-32;/*执行结果97-32=65*/
'A'+32;/*执行结果65+32=97*/
'9'-9;/*执行结果57-9=48*/........more

指针变量的类型说明........part I.......part II.......part III

C/C++语言void及void指针深层探索,如果函数没有返回值,那么应声明为void类型.....more

我们知道变量在计算机内是占有一块存贮区域的, 变量的值就存放在这块区 域之中, 在计算机内部, 通过访问或修改这块区域的内容来访问或修改相应的变 量。Turbo C语言中, 对于变量的访问形式之一, 就是先求出变量的地址, 然后 再通过地址对它进行访问, 这就是这里所要论述的指针及其指针变量。 ...........more




real_vine@hotmail.com