指針呢說白了就是指針變量中的值是一個地址,通過星號運算就可以訪問這個地址上的值了;定義了一個變量,就爲這個變量分配了一個內存空間,內存空間的首地址就是這個變量的地址值;並且,指針變量也有自己的內存空間。
這就是爲什麼給函數傳遞兩個變量的地址就可以交換兩個變量的值,因爲指針變量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的值並沒有交換。
Fun2函數執行過程分析:
分別給指針變量x和指針變量y分配內存空間,將實參傳過來的值給x,y賦值,
也就是 x = &a;y = &b;
接下來執行交換語句,
形參接收實參的值:
x = &a;y = &b;
*x就是取以x的值爲地址的空間上的值,同樣,*y取以y的值爲地址的空間上的值。
接下來執行交換語句。
同樣,函數執行完了之後,系統會自動回收指針變量x和y的內存空間,然而這次卻將
a,b的值交換了,原因是x、y的值是&a和&b,*x和*y交換,也就是a內存空間上的值與b內存空間上的值的交換,從而將a和b的值進行了交換。
2.在C++中有引用的感念,這是一個新的機制,給變量起了一個別名,這樣操作簡單了許多。
3.關於鏈表中出現的指針問題,最長遇到的就是內存泄漏,訪問非法內存的問題,我最大的收穫就 是:
例如:定義鏈表指針Node* p;假設Node數據類型以定義好;
Node* tmp = NULL;
tmp = p->next;
關鍵要知道,p->next 和 tmp的區別,雖然他們兩個的首地址是一樣的,而p->next是相對與p來說的, 也就是p->next中的值是tmp的值,free(tmp);tmp = NULL後 p->next中的值就是一個非法的地址值,訪問p->next時,造成程序奔潰。