2008年8月23日 星期六

如何進行指標 (pointer) 的傳址呼叫(call by reference) (上)

這篇文章介紹函數的傳址呼叫,第一段是利用指標來改變其所指到位址的內容,
傳遞的是指標所存放的地址。第二段是改變指標變數所存放的位址,傳遞的是指標本身的所在的位址。

指標的所存放的內容是地址,通常是其他值的地址。
常見的宣告會告知其內容的地址中所存放值的型態,例如
int *ptr;

這表示ptr的內容地址所指到的地方存放著一個型態為 int 的值。
又例如
void *ptr;

這表示ptr的內容是一個地址,其地址中的值的型態尚未特別指出,暫時空著,
等到後來要用時,必須藉著 cast 的方式來表示其所指值的型態。

指標常用在函數的傳址呼叫(call by reference),在下列的範例中,
函數 modify 傳入一個指標 p,而 *p=100;表示將100放入p所指的位址中。

所以當指標的地址是其他變數的位址時,自然就可以用相同的方式,
透過函數的傳址呼叫來改變其他變數的值。在第二段的modify 函數呼叫前,
我們使用 ptr = &i; 讓ptr 存放著 i 的位址,所以當呼叫modify(ptr);後,i 的值就被改變了。
#include <stdio.h>
#include <stdlib.h>

void modify(int *p)
{
*p = 100;
}

int main(void)
{
int i, *ptr;
pp = &x;
i = 5;

printf("Before: i=%d\n", i);
modify(&i);
printf("After: i=%d\n", i);

printf("Before: ptr=%p, *ptr=%d\n", ptr, *ptr);
i = 20;
ptr = &i;
modify(ptr);
printf("After: ptr=%p, *ptr=%d, &i=%p, i=%d\n", ptr, *ptr, &i, i);

return 0;
}


程式的執行結果如下:

Before: i=5
After: i=100
Before: ptr=0022FFA8, *ptr=0
After: ptr=0022FF70, *ptr=100, &i=0022FF70, i=100


在第二段的內容中,將說明指標變數內容位址的改變方式。

1 則留言:

Unknown 提到...

上面少了宣告x=0,只宣告x會只有殘值