C++ pointer

我要好好懺悔大學的時候囫圇吞棗,pointer一直覺得有點模糊,今天才恍然大悟。

int n = 8;
cout << n << endl;

int *a = &n;
cout << a << endl;

int x = *a;
cout << x << endl;

依序會印出
8
n的記憶體位置
8

非常重要的重點就是*這個符號,寫在宣告裡面跟寫在等式左右邊完全不同
(1)宣告時寫int *a;
其實意義比較像是int* a;
應該把int和*連在一起當作一種型態(指向整數之指標)
但要注意如果像int* a,b;這種寫法
其實等於 int*a; int b;
只有a是指標
(2)在等式的左邊或右邊用*號時則是取得放在那個位址的變數的值

因此也有經典的swap問題
call by value:
void swap(int a, int b){
int tmp = a;
a = b;
b = tmp;
}
沒有用

必須要call by address(call by pointer)
void swap(int* a, int* b){ //a和b都是位址
int tmp = *a; //*a和*b是指向位址的值
*a = *b;
*b = tmp;
}
swap(&x, &y);

或是call by reference(reference就像是變數的alias別名,連記憶體位置都一樣)
(這裏在宣告時的&跟在等式左右邊的&意思也不一樣)
swap(int &a, int &b){
int tmp = a;
a = b;
b = tmp;
}
swap(x,y);

廣告