每個地方都有一個地址
在電腦裡面
我們叫做記憶體位址
e.g.
0x61fe04
補充: 0x在電腦代表十六進位制
指標(Pointer)是用來存取變數位址ㄉ類型
宣告長這樣:
變數類型 *變數名;
#include <iostream>
using namespace std;
int main() {
int* address;
}
變數類型 *變數名;
*要跟著變數名走
每有一個變數就要打一次*
至於*靠近變數類型還是變數名
就看個人選擇(?
#include <iostream>
using namespace std;
int main() {
int* a;
int *b;
int* c, *d;
//a, b, c, d都是指標
int* e, f;
//e是指標,f是個int
}
取址運算子&
為了要讓我們存取變數的位址
在變數前加上&
就可以知道他家住在哪ㄛ
#include <iostream>
using namespace std;
int main() {
int a = 5;
int* address = &a; //指定位址
cout << &a << ' ' << address << '\n';
//兩個是一樣ㄉ
}
取值運算子*
為了要讓我們存取該位址變數的值
在位址前加上*
就可以知道他的值是多少ㄛ
#include <iostream>
using namespace std;
int main() {
int a = 5;
int ca = a; //指定值
int* address = &a; //指定位址
a = 10;
cout << a << ' ' << ca << ' ' << *address << '\n';
//輸出: 10 5 10
}
當該位址的變數值改變時
由於指標存取的是位置
所以值會跟著改變ㄛ
#include <iostream>
using namespace std;
int main() {
int a = 5;
int ca = a; //指定值
int* address = &a; //指定位址
a = 10;
cout << a << ' ' << ca << ' ' << *address << '\n';
//輸出: 10 5 10
}
陣列其實是一種特殊的指標
陣列的變數名其實存取了陣列第一項的位址
#include <iostream>
using namespace std;
int main() {
int arr[3] = {2, 1, 3};
cout << arr << ' ' << *arr << '\n';
//輸出第一個位址以及值(2)
}
所以指標可以存取陣列的每一項!
#include <iostream>
using namespace std;
int main() {
int arr[3] = {2, 1, 3};
int* address = arr;
cout << *address << '\n';
//輸出: 2
address = &arr[1];
cout << *address << '\n';
//輸出: 1
}
由於指標也是數字
加減乘除法也是很重要的操作
\(+\) : 向右平移 \(-\) : 向左平移
指標也可以相減,得到距離
#include <iostream>
using namespace std;
int main() {
int arr[3] = {2, 1, 3};
int* l = arr;
cout << *l << '\n';
//輸出: 2
int* r = arr + 2; //&arr[2]
cout << *r << '\n';
//輸出: 3
int* mid = l + (r-l)/2; //中點
cout << *mid << '\n';
//輸出: 1
}
所以我們就可以用指標把陣列跑過一遍ㄌ
#include <iostream>
using namespace std;
int main() {
int arr[5] = {1, 3, 4, 2, 5};
for(int* p = arr; p != arr + 5; ++p) {
cout << *p << ' ';
}
cout << '\n';
}
struct/class之中也可以放指標
也可以在裡面放自己類型的指標
這樣的性質可以做一些特別的應用w
struct Node {
int val;
Node* next;
};
希望你們可以用指標寫看看
不要偷吃步(?
下面這題比較難
希望你們可以運用這兩周學的知識
用指標、struct/class實作一個Linked List
Hint : 將每個人看成一個物件,並紀錄下一個人是誰(?
下禮拜是社內賽!!
大家嘎U