關於空指標做函式引數和多級指標的使用問題

2021-10-07 12:11:32 字數 1255 閱讀 6833

引入: 在主函式中只是定義了乙個空指標p,如何才能通過子函式的呼叫來完成修改p的內容

#include

#include

// 因為剛開始p什麼都沒有指向(但是p是占有一片記憶體空間的,只是其中的內容為null),所以直接把p的內容傳進子函式賦值是沒有意義的,相當於在子函式中改變了指向了一片新的儲存空間,修改的是新的儲存空間的內容,主函式中p指向的內容並沒有改變(相當於有建立了乙個指標修改了不相關記憶體的內容)

void

fun(

int* p)

intmain()

else

return0;

}

注意事項:

關於在子函式中開闢的動態儲存空間,在子函式呼叫完成之後要,子函式內自己定義的指標變數會自己釋放,但動態儲存空間必須要手動釋放,否則會造成記憶體洩漏

關於定義空指標的問題,一般只要是定義就會占用儲存空間,即會有記憶體位址編號,他所謂的空是指內容的 空 即:不指向任何有效的儲存空間,所以此時不能對*p的記憶體位置寫入內容,否則會造成訪問非法空間的問題。

分析:思路:直接修改,把p的值複製乙份傳到子函式直接開闢一塊記憶體空間,並把位址賦給p,這樣p的值就不是0了 ,「完成修改」。。。

看起來好像是正確的,主函式中p的數值為0,把p傳給子函式然後給p"重新賦值" 。。。

但是無論是數值還是指標做函式形參時,在數值傳遞時,本質上都是把數值(或者位址)重新複製乙份給到子函式中,這樣在子函式中就可以通過訪問數值的位址來改變變數的值了,但如果在這個過程中改變了傳入的位址內容,則修改的則會是改變後位址的內容,本質上這就是兩塊互不相關的內容了,所以這種方法是不可行的。

#include

#include

void

fun(

int*

* q)

intmain()

else

return0;

}

注意問題:

之前一直認為*的個數只是c語言規範的而已,所以在子函式中就試圖用代換思想將其降級成一級指標。。以後就不要再犯了,編譯器不通過

分析:思路:建立傳入指標(指標變數p)的指標,通過直接訪問儲存p的位址內容來修改p的值

此處由於p是定義好的,所以p占有一定的儲存空間,將p的位址傳給子函式,才能修改p的內容,由於p也是乙個指標,所以修改之後的一定也是乙個位址,即修改了p指向的內容。

所以此處再次輸出時就會列印出修改之後指向儲存空間內容的內容(5)

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

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

指標做函式引數

程式1 void main void mymalloc char s 我想在函式中分配記憶體,再返回 mymalloc p 的執行過程 分配乙個臨時變數char s,s的值等於p,也就是null,但是s占用的是與p不同的記憶體空間。此後函式的執行與p一點關係都沒有了!只是用p的值來初始化s。然後s ...

函式指標做函式引數

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