首先理解幾個概念:
1.對於乙個普通變數,進行引用操作,得到的是一級指標。如int a=0;int *p=&a,則&a就是一級指標。因為&a的值就是a的位址,p的值也是a的位址,則&a和p就是一級指標變數(簡略為指標),對&a進行解引用操作,int b=*&a;這b等於0.
2.對於普通變數作為形參傳遞到函式內部,引數的值傳遞就意味著只是簡單的將變數的值copy了乙份到臨時變數中,然後將臨時變數傳遞給函式,然而臨時變數和原始變數是沒有任何關係,則函式是無法改變外部原始變數的值
3.對於一級指標變數作為形參傳遞到函式內部,雖然這個一級指標的值(就是指向物件的位址)會copy乙份到臨時變數,但是這個臨時變數的內容是乙個位址,通過->解引用乙個位址可以修改該位址所指向的記憶體單元的值。總結:一級指標作為引數傳遞,可以改變外部變數的值,即一級指標所指向的內容,但是卻無法改變指標本身。
對於二級指標:
1.對於乙個二級指標進行解引用得到一級指標,對於乙個一級指標解引用得到原始變數,int **p,*p就是乙個指標,**p就是原始變數的值。
2.一級指標和二級指標的值都是指向乙個記憶體單元,一級指標指向的記憶體單元存放的是源變數的值,二級指標指向的記憶體單元存放的是一級指標的位址
int a =1;
int *b =&a;
int **c=&b;
cout<<&a《二級指標一般用在需要修改函式外部指標的情況。因為函式外部的指標變數,只有通過二級指標解引用得到外部指標變數在記憶體單元的位址,修改這個位址所指向的內容即可。
#include #include #include void increase(int** ptr)
int main(int argc, char** argv)
/*這段**,執行結果count = 8, countptr = null;*/
或者是:
void getmemory( char **p, int num )
void test( void )
4.對於c語言的引數傳遞都是值傳遞,當傳傳遞乙個指標給函式的時,其實質上還是值傳遞,除非使用雙指標.
首先,指標變數,它也是乙個變數,在記憶體單元中也要占用記憶體空間。一級指標變數指向的內容是普通變數的值,二級指標變數指向的內容是一級指標變數的位址。
指標與二級指標
int num 10 int p1 int p2 p1 指標的指向結構如下圖所示 0x4000 0x3000 p2 0x2000 p1 num p2 表示的是儲存p2指標的位址 p2 表示的是p2指向的位址,即指標p1存放的位址 p2 表示指標p2指向位址中所存的值,即指標p1指向的位址,即變數nu...
一級指標二級指標
例如 int p null int代表指標p指向的資料型別是int型,代表這是乙個指標變數,1 指標變數儲存的內容是指向的變數的位址 2 在使用sizeof判斷指標的位元組數時,在32位機器上為4個位元組,在64位機器上為了相容,仍然是四個位元組大小 3 小知識點,不同型別的指標除了指向的變數資料型...
關於二級指標
include include struct stu void func2 struct stu s void main 上述 中有段錯誤。說明 1 在呼叫func2時,系統會重新建立形參指標變數,且值 s。在該函式裡面僅僅是對形參重新賦值,但該形參的改變不會改變傳遞的實參 值傳遞 所以func2執...