C 中一級指標和雙重(二級)指標作為函式引數傳遞

2021-08-20 13:24:25 字數 1491 閱讀 1639

引用博文:

函式引數傳遞的只能是數值,所以當指標作為函式引數傳遞時,傳遞的是指標的值,而不是位址。

當指標作為函式引數傳遞時,在函式內部重新申請了乙個新指標,與傳入指標指向相同位址。在函式內部的操作只能針對指標指向的值。

#include using namespace std;

void pointer(int *p)

int main()

執行結果:

the b address 003dfc98

the p is point to 003dfc98 , p's addr is 3dfc8c, *p is 22

enter function

the p is point to 003dfc98 , p's addr is 3dfbb8, *p is 22

the p is point to 003dfc98 , p's addr is 3dfbb8, *p is 11

the p is point to 003dfb98 , p's addr is 3dfbb8, *p is 33

function return

the p is point to 003dfc98 , p's addr is 3dfc8c, *p is 11

請按任意鍵繼續. . .

1. 在沒有進入pointer函式之前,變數p儲存的值為003dfc98,變數p的位址為3dfc8c,*p的值等於b的值等於22。

2. 進入pointer之後,p所指向的記憶體位址沒有改變,但是p自身的位址變了。意味著函式傳遞只是將003dfc98傳遞進來了。雖然這個指標變數名字還是叫做p,但與main函式中的指標變數已經不一樣了。這意味著,你可以改變main函式中b的值,但是不能改變p的值。

函式引數為指標的指標 (雙重指標)

#include using namespace std;

void getmemory(char *p, int num)

void main()

getmemory這個函式是呼叫malloc申請一塊記憶體。乍一看好像沒什麼問題,編譯也不會報錯。但是執行起來,程式直接奔潰。 其實有了上面的分析就可以知道,getmemeory中的p是不能改變s的指向的,也就是說s還是指向null。getmemory中的p是臨時申請的乙個指標變數,當s傳值進來(null),時,p指向null,除此之外,沒做任何改變。當執行malloc函式後,也只是將malloc返回的的指標位址賦給了p,並不能傳遞給s。所以這裡就需要指標的指標(雙重指標)了。

#include using namespace std;

void getmemory(char **p, int num)

void main()

這個時候就是將指標變數s的位址傳遞了過去,而不是將指標變數的值(null)傳遞了過去,因此就可以改變s的指向了。

一級指標和二級指標

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

一級指標二級指標

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

十二 c 指標 一級指標和二級指標

指標是一種非常方便靈活的東西,原來學c的時候學指標的時候記得課本一堆亂七八糟的注意事項,其實如果只是做做機試題的話根本沒那麼多用法,就會最基本就行 比如乙個例子 求乙個n 4矩陣裡面存放的最大元素,如果知道具體數字,最為初學者就直接兩個for迴圈找到最大的值了。其實這樣也不難,多了乙個一維大小是未知...