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