指標
什麼是指標??
指標是用來儲存「某個變數的地址」的變數

變數

指標
&a = 0x7ffd48db68dcint a = 10;為什麼需要指標?
-
可以直接操作記憶體位置(更靈活)
-
可以讓函式改變外部變數的值(傳址呼叫)
-
可以處理動態記憶體配置(如用
new配陣列) -
操作複雜資料結構(例如串列、樹、圖等)
指標與變數
int a = 5;
int* p = &a;
cout << *p; // 印出 a 的值
&a
取址運算子 &:取得某個變數在記憶體中的地址(位址)
宣告指標 : 表示這是一個指標變數
int* p
cout << *p;
*:拿到指標 p 指向的記憶體地址後取出那個位置的值
& 位址
* 值
a |
變數 a 的值(10) |
| &a | 變數a 的地址(像 0x7ffe...) |
| p | 儲存地址的指標變數 |
| *p | 指向的記憶體中的值(10) |
*(&a) == a
&(*p) == p
| 用法 | 說明 | 例子 |
|---|---|---|
| 宣告指標 | 表示這是一個指標變數 | int* p; |
| 解參運算子 | 取出指標所指的內容 | *p = 20; |
int x = 42;
int* p = &x;
cout << x << endl; // ?
cout << &x << endl; // ?
cout << p << endl; // ?
cout << *p << endl; // ?小練習
0x7ffe7581edbc
42
0x7ffe7581edbc
42
指標與陣列
int arr[3] = {1, 2, 3};
cout << arr; // 輸出 arr 的記憶點址
cout << *arr; // 輸出 arr[0] 的值 -> 1陣列名就是指向第一個元素的指標
int arr[3] = {10, 20, 30};
int* p = arr; // 等同於 int* p = &arr[0];
cout << *p; // 10
cout << *(p+1); // 20
cout << *(p+2); // 30指標採用指針計算遞往陣列
p+1 會跳過 1 個 int (如果 int 是 4 byte 就是 +4 bytes)
指標與函數
函式參數預設是傳值
void setToZero(int x) {
x = 0;
}
int a = 5;
setToZero(a);
cout << a; // 還是 5-
傳值:函式只是操作變數的「副本」
使用指標達到「傳址」效果
&a(參考傳遞)
#include <iostream>
using namespace std;
void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
}
int main(){
int x=2, y=5;
swap(x, y);
cout << x << ' ' << y << endl;
}輸出 : 2 5
int a, int b : 創建 a 和 b 的副本
int &a, int &b : 傳遞變數的實際記憶體位置
&a(參考傳遞)
#include <iostream>
using namespace std;
void swap(int &a, int &b) {
int temp = a;
a = b;
b = temp;
}
int main() {
int x = 5;
int y = 10;
cout << "Before swap: x = " << x << ", y = " << y << endl;
swap(x, y);
cout << "After swap: x = " << x << ", y = " << y << endl;
return 0;
}
輸出:
Before swap: x = 5, y = 10
After swap: x = 10, y = 5
補 : 時間複雜度
時間複雜度(Time Complexity)是什麼?
時間複雜度描述的是「演算法執行所需步驟的增長速度」
// O(1):常數時間
int a = 10;
cout << a;
// O(n):線性時間
for (int i = 0; i < n; i++) {
cout << i;
}
// O(n^2):平方時間
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cout << i << "," << j;
}
}
無論資料多大都一樣
跟資料一樣多
雙層巢狀迴圈
使用 大 O 表示法(Big-O notation) 來描述最壞情況
| 複雜度 | 說明 | 當 n=100 時迴圈大約跑幾次 |
|---|---|---|
| O(1) | 無論資料多大都一樣 | 1 次 |
| O(log n) | 資料每次折半處理 | 約 7 次 |
| O(n) | 跟資料一樣多 | 100 次 |
| O(n log n) | 排序常見的效率 | 約 700 次 |
| O(n^2) | 雙層巢狀迴圈 | 10,000 次 |
| O(2^n) | 指數成長(爆炸) | 2^100 ≈ 天文數字 |
空間複雜度
什麼是空間複雜度(Space Complexity)?
空間複雜度是描述「演算法在執行時需要多少額外記憶體」來儲存變數、陣列、堆疊、遞迴等等。
int x = 10; // O(1):一個變數
int arr[100]; // O(1):固定大小
int* dynamic = new int[n]; // O(n):動態配置
| 複雜度 | 說明 | 範例 |
|---|---|---|
| O(1) |
只用幾個變數 | 迴圈內只有變數 i、j |
| O(n) | 隨輸入大小建立陣列用 |
new int[n] 開空間 |
| O(n^2) | 二維陣列 | new int[n][n] |
| O(log n) | 遞迴深度每層只用一點空間 | 二元樹搜尋的遞迴 |
謝謝社長~~
kahoot!
指標
By phoebe tsai
指標
- 171