這篇文章介紹函數的傳址呼叫,第一段是利用指標來改變其所指到位址的內容,
傳遞的是指標所存放的地址。第二段是改變指標變數所存放的位址,傳遞的是指標本身的所在的位址。
指標的所存放的內容是地址,通常是其他值的地址。
常見的宣告會告知其內容的地址中所存放值的型態,例如
這表示ptr的內容地址所指到的地方存放著一個型態為 int 的值。
又例如
這表示ptr的內容是一個地址,其地址中的值的型態尚未特別指出,暫時空著,
等到後來要用時,必須藉著 cast 的方式來表示其所指值的型態。
指標常用在函數的傳址呼叫(call by reference),在下列的範例中,
函數 modify 傳入一個指標 p,而 *p=100;表示將100放入p所指的位址中。
所以當指標的地址是其他變數的位址時,自然就可以用相同的方式,
透過函數的傳址呼叫來改變其他變數的值。在第二段的modify 函數呼叫前,
我們使用 ptr = &i; 讓ptr 存放著 i 的位址,所以當呼叫modify(ptr);後,i 的值就被改變了。
程式的執行結果如下:
在第二段的內容中,將說明指標變數內容位址的改變方式。
傳遞的是指標所存放的地址。第二段是改變指標變數所存放的位址,傳遞的是指標本身的所在的位址。
指標的所存放的內容是地址,通常是其他值的地址。
常見的宣告會告知其內容的地址中所存放值的型態,例如
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 則留言:
上面少了宣告x=0,只宣告x會只有殘值
張貼留言