指標
每個變數宣告時都會有一個相對應的記憶體地址
變數前加&即可輸出其記憶體位址(一個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";
}應用
- 連結串列
動態開點線段樹treap
指標
By alan lai
指標
- 69