對指針的一點理解

  1. 指針呢說白了就是指針變量中的值是一個地址,通過星號運算就可以訪問這個地址上的值了;定義了一個變量,就爲這個變量分配了一個內存空間,內存空間的首地址就是這個變量的地址值;並且,指針變量也有自己的內存空間。

  2. 143127462.png

    這就是爲什麼給函數傳遞兩個變量的地址就可以交換兩個變量的值,因爲指針變量p中的值是傳入變量 的地址,而不是簡單的傳值;p和&a是一樣的,操作p就是操作變量a的地址,*p就是a的緣故;

Fun1(int x, int y)
{
int tmp = x;
x = y;
y = tmp;
}
Fun2(int *x, int *y)
{
int tmp = *x;
*x = *y;
*y = tmp;
}
int main(void)
{
int a = 1;
int b = 2;
Fun1(a, b);
Fun1(1, 2);
Fun2(&a, &b);
return 0;
}

Fun1函數執行過程分析:

分別給x和y分配內存空間,將實參傳過來的值給x,y賦值,也就是:x = a;y = b

接下來執行交換語句,只是將x和y的值交換了,大家都知道,函數執行結束,x,y內存空間就會被收回,這樣在主函數中a,b的值並沒有交換。

151922817.png

Fun2函數執行過程分析:

    分別給指針變量x和指針變量y分配內存空間,將實參傳過來的值給x,y賦值,

    也就是 x = &a;y = &b

    接下來執行交換語句,

     形參接收實參的值:

     x = &a;y = &b

152215833.png

*x就是取以x的值爲地址的空間上的值,同樣,*y取以y的值爲地址的空間上的值。

接下來執行交換語句。

同樣,函數執行完了之後,系統會自動回收指針變量x和y的內存空間,然而這次卻將

a,b的值交換了,原因是x、y的值是&a和&b,*x和*y交換,也就是a內存空間上的值與b內存空間上的值的交換,從而將a和b的值進行了交換。

2.在C++中有引用的感念,這是一個新的機制,給變量起了一個別名,這樣操作簡單了許多。

3.關於鏈表中出現的指針問題,最長遇到的就是內存泄漏,訪問非法內存的問題,我最大的收穫就   是:

  1.     例如:定義鏈表指針Node* p;假設Node數據類型以定義好;

  2.     Node* tmp = NULL;

  3.     tmp = p->next;

  4.     關鍵要知道,p->next 和 tmp的區別,雖然他們兩個的首地址是一樣的,而p->next是相對與p來說的,  也就是p->next中的值是tmp的值,free(tmp);tmp = NULL後 p->next中的值就是一個非法的地址值,訪問p->next時,造成程序奔潰。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章