一級指標還是二級指標作函式引數(2)

2021-07-05 14:56:46 字數 1153 閱讀 3901

程式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  

一級指標二級指標

例如 int p null int代表指標p指向的資料型別是int型,代表這是乙個指標變數,1 指標變數儲存的內容是指向的變數的位址 2 在使用sizeof判斷指標的位元組數時,在32位機器上為4個位元組,在64位機器上為了相容,仍然是四個位元組大小 3 小知識點,不同型別的指標除了指向的變數資料型...

一級指標與二級指標

如下圖所示,整型指標xptr指向變數x的位址。原始碼 include int main 實現方法一如下圖所示,先為二級整型指標ptr分配空間,然後賦值。原始碼 include include int main printf n return 0 執行結果 實現方法二 如下圖所示,先為二級整型指標pt...

一級指標和二級指標

通常用作函式的輸入引數,因為一級指標作為函式引數,在呼叫的時候,實參和形參是不同的記憶體空間,只是,這個記憶體空間存放的指標指向的是同一塊位址,所以形參在函式執行中可以訪問實參指向的記憶體空間,但是形參的指向的改變並不能影響實參。總結一句話 一級指標做函式引數,在函式內做形參做重新指向並 不會影響實...