• 沒有找到結果。

什麼是指標?

N/A
N/A
Protected

Academic year: 2022

Share "什麼是指標?"

Copied!
38
0
0

加載中.... (立即查看全文)

全文

(1)

指標 (pointer)

bigelephant29

(2)

什麼是指標?

什麼是指標?

(3)

什麼是指標?

什麼是指標?

• 是一種變數,儲存一個記憶體位址。

(4)

什麼是指標?

什麼是指標?

• 是一種變數,儲存一個記憶體位址。

• 在 32 位元電腦上跟 64 位元電腦上的長度不一樣!

(5)

什麼是指標?

什麼是指標?

• 是一種變數,儲存一個記憶體位址。

• 在 32 位元電腦上跟 64 位元電腦上的長度不一樣!

• 什麼是記憶體?

(6)

什麼是記憶體?

什麼是記憶體?

(7)

什麼是記憶體?

什麼是記憶體?

• 程式裡面的所有變數都存在記憶體中。

• 可以想像成一個很大的陣列。

• 指標可以儲存記憶體位址。

(8)

宣告變數 宣告變數

(9)

宣告變數 宣告變數

• 當我們在宣告變數的時候,其實就是挑一個記憶體位址並取名字

int a = 1266;

(10)

宣告變數 宣告變數

• 當我們在宣告變數的時候,其實就是挑一個記憶體位址並取名字

int a = 1266;

• 這個時候,在記憶體的某處就會存下這個變數的資訊。

(11)

宣告變數 宣告變數

• 當我們在宣告變數的時候,其實就是挑一個記憶體位址並取名字

int a = 1266;

• 這個時候,在記憶體的某處就會存下這個變數的資訊。

• 在 C/C++ 中,資料型態 int 佔用了 4 bytes 。

(12)

宣告指標 宣告指標

(13)

宣告指標 宣告指標

• 宣告一個指向儲存 type 位址的指標 c :

type *c;

(14)

宣告指標 宣告指標

• 宣告一個指向儲存 type 位址的指標 c :

type *c;

• 例如:指向 int 的指標

int *ptr;

(15)

宣告指標 宣告指標

• 宣告一個指向儲存 type 位址的指標 c :

type *c;

• 例如:指向 int 的指標

int *ptr;

• 我們要怎麼把一個變數的位址放進 *ptr 呢?

(16)

取址、參照

取址、參照

(17)

取址、參照 取址、參照

• 一元運算子 & 可以用來取(參照)變數位址。

int a = 1266;

int *ptr; //int *ptr = &a;

ptr = &a;

(18)

取值 取值

(19)

取值 取值

• 當我們要取值的時候,在指標前面放上星號 * 就可以了!

int *ptr = &a;

printf(“%d\n”, *ptr);

(20)

有星號與沒有星號的差別

有星號與沒有星號的差別

(21)

有星號與沒有星號的差別 有星號與沒有星號的差別

• 將 ptr 指向變數 a 的位址:

int *ptr;

ptr = &a; // a 必須要是 int

(22)

有星號與沒有星號的差別 有星號與沒有星號的差別

• 將 ptr 指向變數 a 的位址:

int *ptr;

ptr = &a; // a 必須要是 int

• 將 ptr 指向指標 b 指向的位址:

int *ptr;

ptr = b; // b 必須要是 int*

(23)

是指標?不是指標?

是指標?不是指標?

• int* a, b;

• int *c, d;

• int *e,*f;

(24)

是指標?不是指標?

是指標?不是指標?

• int* a, b;

• int *c, d;

• int *e,*f;

• 指標( int* ): a 、 c 、 e 、 f

• 不是指標 (int ): b 、 d

(25)

參照小技巧

參照小技巧

(26)

參照小技巧 參照小技巧

• 可以讓兩個變數同時代表同一個位址!

• int a = 1266;

• int &b = a;

(27)

參照小技巧 參照小技巧

• 可以讓兩個變數同時代表同一個位址!

• int a = 1266;

• int &b = a;

• 此時 a 和 b 是等價的喔!

(28)

未來的某一天

未來的某一天

(29)

未來的某一天 未來的某一天

dp[i+dx[k]][j+dy[k]]=

((dp[i+dx[k]][j+dx[k]]*arr[p++]+dp[i][j])%MOD+MOD)%MOD;

(30)

未來的某一天 未來的某一天

dp[i+dx[k]][j+dy[k]]=

((dp[i+dx[k]][j+dx[k]]*arr[p++]+dp[i][j])%MOD+MOD)%MOD;

• Code 打錯字自己都不知道

int &tmp = dp[i+dx[k]][j+dy[k]];

tmp = ((tmp*arr[p++]+dp[i][j])%MOD+MOD)%MOD;

(31)

複習一番 複習一番

int a = 0, b = 1;

int *ptr = &a;

printf(“%d %d\n”, a, b); // a = 0, b = 1

*ptr = 1266;

printf(“%d %d\n”, a, b); // a = 1266, b = 1

ptr = &b;

*ptr = 123;

printf(“%d %d\n”, a, b); // a = 1266, b = 123

(32)

傳值與傳址 傳值與傳址

void swap(int a, int b){

int tmp = a;

a = b;

b = tmp;

}

• 從外面呼叫這個函式會發生什麼事情呢?

(33)

傳值與傳址 傳值與傳址

void swap(int *a, int *b){

int tmp = *a;

*a = *b;

*b = tmp;

}

• 加上星號?

(34)

傳值與傳址 傳值與傳址

void swap(int &a, int &b){

int tmp = a;

a = b;

b = tmp;

}

• 這樣呢?

(35)

陣列與指標

陣列與指標

(36)

陣列與指標 陣列與指標

• 陣列其實是一個用指標維護的結構。

(37)

陣列與指標 陣列與指標

• 陣列其實是一個用指標維護的結構。

• 宣告時,是宣告陣列的第一項位址和陣列的大小。

int arr[1000];

int *ptr = new int[1000];

(38)

THE END

參考文獻

相關文件

Relativamente à “área das fracções”, no 3º trimestre de 2005, o preço médio por metro quadrado transaccionado em Macau foi de 19.522 patacas para as fracções autónomas

Relativamente à “área das fracções”, no 4º trimestre de 2005, o preço médio por metro quadrado em Macau foi de 17.982 Patacas para as fracções autónomas residenciais dos

「不孝」之人,只要懷有「治國用兵之術」

項目 指標 指標內涵及執行成果說明 3-3

Office of Early Childhood Development, Virginia Department of Social Services (2013). Milestones of child development: A guide to young children’s learning and development from

collectively called derived declarator types.hh. C99

and Pearson Edition Inc.. All

簡⾔言之,在 C 語⾔言裡如果你想要讓其他函式可以幫