本文轉載自:https://www.cnblogs.com/WeyneChen/p/6672045.html
函數參數傳遞的只能是數值,所以當指針作為函數參數傳遞時,傳遞的是指針的值,而不是地址。
#include "stdio.h" void pointer(int *p) { int a = 11; printf("\n\nEnter function"); printf("\nthe p is point to %p , addr is %X, *p is %d",p , &p, *p); *p =11; printf("\nthe p is point to %p , addr is %X, *p is %d",p , &p, *p); p = &a; printf("\nthe p is point to %p , addr is %X, *p is %d",p , &p, *p); printf("\nfunction return\n"); } int main() { int b =22; int *p = &b; printf("the b address %X\n",&b); printf("the p is point to %p , addr is %X, *p is %d",p , &p, *p); pointer(p); printf("\nthe p is point to %p , addr is %X, *p is %d\n",p , &p, *p); }
輸出結果:
the b address 28FF3C
the p is point to 0028FF3C , addr is 28FF38, *p is 22
Enter function the p is point to 0028FF3C , addr is 28FF20, *p is 22 the p is point to 0028FF3C , addr is 28FF20, *p is 11 the p is point to 0028FF0C , addr is 28FF20, *p is 11 function return the p is point to 0028FF3C , addr is 28FF38, *p is 11
- %p為指針所指向的數據的地址,這里既為變量b的地址。
- 在沒有進入pointer函數之前,變量p存儲的值為28FF3C,變量p的地址為28FF38,*p的值等於b的值等於22
- 進入pointer之后,p所指向的內存地址沒有改變,但是p自身的地址變了。意味着函數傳遞只是將28FF3C傳遞進來了。雖然這個指針變量名字還是叫做p,但與main函數中的指針變量已經不一樣了。這意味着,你可以改變main函數中b的值,但是不能改變p的值
函數參數為指針的指針
先看一個例子:
#include "stdio.h" void GetMemory(char *p,int num) { p=(char*)malloc(sizeof(char)*num); } void main() { char *str=NULL; GetMemory(str,100); strcpy(str,"hello"); printf(str); }
GetMemory這個函數是調用malloc申請一塊內存。乍一看好像沒什么問題,編譯也不會報錯。但是運行起來,程序直接奔潰。 其實有了上面的分析就可以知道,GetMemeory中的p是不能改變str的指向的,也就是說str還是指向NULL。GetMemory中的P是臨時申請的一個指針變量,當str傳值進來(NULL),時,p指向NULL,除此之外,沒做任何改變。當運行malloc函數后,也只是將malloc返回的的指針地址賦給了p,並不能傳遞給str。所以這里就需要指針的指針了
#include "stdio.h" void GetMemory(char **p,int num) { *p=(char*)malloc(sizeof(char)*num); } void main() { char *str=NULL; GetMemory(&str,100); strcpy(str,"hello\n"); printf(str); }
這個時候就是將指針變量str的地址傳遞了過去,而不是將指針變量的值(NULL)傳遞了過去,因此就可以改變str的指向了。