指標做函式引數

2021-07-22 05:47:19 字數 1150 閱讀 3041

程式1:

void  main()    

void  mymalloc(char  *s)  //我想在函式中分配記憶體,再返回  

mymalloc(p)的執行過程:  

分配乙個臨時變數char  *s,s的值等於p,也就是null,但是s占用的是與p不同的記憶體空間。此後函式的執行與p一點關係都沒有了!只是用p的值來初始化s。  

然後s=(char  *)  malloc(100),把s的值賦成malloc的位址,對p的值沒有任何影響。p的值還是null。  

注意指標變數只是乙個特殊的變數,實際上它存的是整數值,但是它是記憶體中的某個位址。通過它可以訪問這個位址。  

程式2:

void  mymalloc(char  **s)  

void  main()  

程式2是正確的,為什麼呢?看乙個執行過程就知道了:  

mymalloc(&p);將p的位址傳入函式,假設儲存p變數的位址是0x5555,則0x5555這個位址存的是指標變數p的值,也就是ox5555指向p。  

*s=(char *)malloc(100);這一句話的意思是

將s所指向的值,也就是0x5555這個位置上的變數的值賦為(char *)malloc(100)(並不是改變p的位址值0x5555,而是指標變數

p本身的值) ,而0x5555這個位置上存的是恰好是指標變數p,這樣p的值就變成了(char *)malloc(100)的值。即p的值是新分配的這塊記憶體的起始位址。  

這個問題理解起來有點繞,關鍵是理解變數作函式形參呼叫的時候都是要分配乙個副本,不管是傳值還是傳址。傳入後就和形參沒有關係了,它不會改變形參的值。mymalloc(p)不會改變p的值,p的值當然是 null,它只能改變p所指向的記憶體位址的值。但是mymalloc(&p)為什麼就可以了,它不會改變(&p)的值也不可能改變,但是它可以改變(&p)所指向記憶體位址的值,即p的值。  

程式3:  

#include  

void  fun(int  *p)  

main()  

結果為  

10  

10  

程式4:  

void  fun(int  *p)  

main()  

結果為  

10  

100  

函式指標 函式指標做函式引數

陣列型別如何定義 typedef int myarray 5 這是我定義的陣列型別,這個型別的名字是myarray,它的本質是乙個記憶體固定大小模板 myarray arr arr是乙個陣列 大小為5 型別的變數。可以這樣訪問arr 0 arr 1 arr 2 typedef int myp 5 定...

函式指標做函式引數

函式指標是指向函式的指標變數,即本質是乙個指標變數。int f int x 宣告乙個函式指標 f func 將func函式的首位址賦給指標f 指向函式的指標包含了函式的位址,可以通過它來呼叫函式。宣告格式如下 型別說明符 函式名 引數 其實這裡不能稱為函式名,應該叫做指標的變數名。這個特殊的指標指向...

函式指標做函式引數

define crt secure no warnings include include include int myadd int a,int b 子任務的實現者 int myadd2 int a,int b 子任務的實現者 int myadd3 int a,int b 子任務的實現者 int ...