指標

每個變數宣告時都會有一個相對應的記憶體地址

變數前加&即可輸出其記憶體位址(一個16進位數)

int test = 1;
cout << &test;

指標變數

利用指標儲存一個記憶體位址,並間接指向它

指標也是一種變數,可以隨意改變其指向的記憶體位址

語法

int *pointer;
int test1 = 123, test2 = 456;

pointer = &test1;
cout << *pointer << "\n"; //123

pointer = &test2;
cout << *pointer << "\n"; //456

pointer = &test1;
*pointer = 20
cout << test1 << "\n"; //20

pointer = &test2;
*pointer = 89
cout << test2 << "\n"; //89

pointer = test1 // error!!
*pointer = &test2; // error!!
  • 變數前不加*,代表 回傳/改變 指標變數的記憶體地址 
  • 變數前加*,代表 回傳/改變 指標所指向的記憶體位址的值

兩個不能互相指定

陣列

陣列本身是就是指標,其指向陣列第一項的地址

int array[100]

array存array[0]的地址

=*(array+i)         第0項往後i項的值

array[i]
cout<<array;

array[i]的記憶體地址

cout<<array+i;

函數傳入指標

可以利用指標把區域變數丟給其他函數去修改

(否則只是複製到新的記憶體)

*區域變數:宣告在某個大括號(陳述區塊)裡,其有效範圍也只在大括號裡

*全域變數:宣告在最外面,有效範圍為全部

void add(int *a, int *b){
  *a += *b;
}

int main(){
  int aa=1, bb=2;
  add(&aa, &bb); //傳入aa, bb的記憶體地址
  // error: add(1, 2);
  // 1, 2不是一個記憶體地址
  cout << aa;
}

變數

void change(int *a){
  a[2] = 10;
}

int main(){
  int arr[10];
  arr[2] = 9;
  cout << arr[2] << "\n";
  change(arr);
  cout << arr[2] << "\n";
}

陣列

實作:交換函式

void swap(int *a, int *b){
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

int main(){
    int aa = 2, bb = 10;
    swap(&aa, &bb);
    cout << aa << " " << bb << "\n";
}

應用

指標

By alan lai

指標

  • 69