C++

Topic: pointer

Lecturer: Lemon

你家住哪裡(?

地址

每個地方都有一個地址

在電腦裡面

我們叫做記憶體位址

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

Made with Slides.com