指標與函式引數傳遞
c語言在傳遞引數時,會預設為形參分配新的記憶體空間,形參只有在被呼叫時才分配記憶體
單元,在呼叫結束時,即刻釋放所分配的記憶體單元。
void main()
void change(int i)
我們可以看到,呼叫change()方法後並沒有改變i的值,我們可以把main方法和change()方法中的變數位址列印出來看是否相同。我們可以看到兩個位址的值是不一樣的。故我們認為他們不是同乙個變數,這是因為編譯器為形參分配了新的記憶體空間儲存,當方法執行完之後,該記憶體空間被釋放。在方法中改變形參並不會對實參造成影響。我們稱這種傳遞為值傳遞。
那麼,我們如何才能在chang方法中改變i的值呢?指標這時候就派上用場了。
void main()
void change(int *p)
我們把引數的位址傳入方法,實現了通過指標改變量的值。由此我們知道要想在外部方法中改變乙個變數需要變數的位址。
不是所有引數傳遞都是值傳遞,陣列作為引數傳遞時就是位址傳遞。
陣列與指標
int a[5] = ; //定義乙個陣列
printf(「%x %x」,a,&a);
c語言中陣列名是乙個常量,不可賦值。陣列名即是陣列的名稱,同時又是陣列的首位址。我們可以看到列印出的a和&a值是一樣的。
int * p =a;//宣告乙個指標變數,指向陣列首元素位址。
printf(「%d %d」,*p,a[0]); //列印*p的值和a[0]的值
我們可以看到此處*p = a[0],p = &a[0];
我們知道a+1是指標前進乙個sizeof(int),故此,我們可以通過指標迴圈遍歷陣列:
for (int i = 0; i < 5; i++)
可以看到,列印出來的值是一致的。
我們得出結論:
a[i] = *(a+i);
陣列作為引數傳遞時,傳遞的是陣列的首位址,這種傳遞稱之為位址傳遞
上面**結果可以看出,實參和形參的陣列首位址是相同的。
二級指標
指標變數作為乙個變數,佔據記憶體空間,有其位址,故可以用乙個指標指向它,指向指標的指標我們稱之為二級指標,該二級指標儲存了一級指標變數的位址。我們假設有兩個箱子,b箱子放著寶貝,但b箱子的鑰匙鎖在a箱子裡這裡,a箱子可以看成是二級指標。
二級指標的宣告
int num =100;
int *p = &num
int **pp = &p;
printf("i = %d,i = %d", *p,**pp); //列印*p和**pp的值
我們可以看到*p和**pp的值是相同的。
**pp = *p = num
*pp = p =&num
pp = &p
什麼時候用到二級指標呢?我們知道要在外部方法中改變乙個變數的值需要傳變數的位址,那麼我們要改變乙個指標的值就需要傳遞指標的指標即二級指標。
void change(int **p,int *num)
void main()
我們可以看到修改前和修改後指標p的值是不同的。二級指標作為引數傳遞可以改變一級指標的值。
待續......
重拾C語言之指標篇(三)
指標常量與常量指標 常量是不可修改不可賦值,在程式執行中其值是不會改變的。c語言中宣告乙個常量指標形式如下 1 常量指標 const int p int const p 常量指標顧名思義是乙個常量的指標,指向的是乙個常量,這個常量能通過指標訪問,但不能通過指標修改它的值。void main 從上,我...
重拾c語言之動態記憶體分配
動態記憶體分配 傳統陣列的缺點 1陣列長度必須事先制定,且只能是長整數不能是變數 2傳統形式定義的陣列該陣列的記憶體程式無法手動釋放 3陣列一旦定義,系統就會為該陣列分配的儲存空間就會一直存在直到該函式執行結束 4陣列的長度不能再函式的執行的過程中動態的擴充或者縮小 5不能跨函式使用 為什麼需要動態...
C語言之指標二
函式指標 如果在程式定義了乙個函式,在編譯時,編譯系統為函式 分配一段儲存空間,這段儲存空間的起始位址,稱為這個函式的指標 函式名就是函式開始的位址 函式二級指標可以修改函式指標的指向 函式指標,不僅僅是位址,必須明確函式指標型別和輸出引數型別和數量 函式名可以作為引數傳遞給函式指標 include...