指標

什麼是指標??

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

變數

指標

&a = 0x7ffd48db68dc
int a = 10;

 為什麼需要指標?

  1. 可以直接操作記憶體位置(更靈活)

  2. 可以讓函式改變外部變數的值(傳址呼叫)

  3. 可以處理動態記憶體配置(如用 new 配陣列)

  4. 操作複雜資料結構(例如串列、樹、圖等)

指標與變數

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