指標 (pointer)
bigelephant29
什麼是指標?
什麼是指標?
什麼是指標?
什麼是指標?
• 是一種變數,儲存一個記憶體位址。
什麼是指標?
什麼是指標?
• 是一種變數,儲存一個記憶體位址。
• 在 32 位元電腦上跟 64 位元電腦上的長度不一樣!
什麼是指標?
什麼是指標?
• 是一種變數,儲存一個記憶體位址。
• 在 32 位元電腦上跟 64 位元電腦上的長度不一樣!
• 什麼是記憶體?
什麼是記憶體?
什麼是記憶體?
什麼是記憶體?
什麼是記憶體?
• 程式裡面的所有變數都存在記憶體中。
• 可以想像成一個很大的陣列。
• 指標可以儲存記憶體位址。
宣告變數 宣告變數
宣告變數 宣告變數
• 當我們在宣告變數的時候,其實就是挑一個記憶體位址並取名字
。
int a = 1266;
宣告變數 宣告變數
• 當我們在宣告變數的時候,其實就是挑一個記憶體位址並取名字
。
int a = 1266;
• 這個時候,在記憶體的某處就會存下這個變數的資訊。
宣告變數 宣告變數
• 當我們在宣告變數的時候,其實就是挑一個記憶體位址並取名字
。
int a = 1266;
• 這個時候,在記憶體的某處就會存下這個變數的資訊。
• 在 C/C++ 中,資料型態 int 佔用了 4 bytes 。
宣告指標 宣告指標
宣告指標 宣告指標
• 宣告一個指向儲存 type 位址的指標 c :
type *c;
宣告指標 宣告指標
• 宣告一個指向儲存 type 位址的指標 c :
type *c;
• 例如:指向 int 的指標
int *ptr;
宣告指標 宣告指標
• 宣告一個指向儲存 type 位址的指標 c :
type *c;
• 例如:指向 int 的指標
int *ptr;
• 我們要怎麼把一個變數的位址放進 *ptr 呢?
取址、參照
取址、參照
取址、參照 取址、參照
• 一元運算子 & 可以用來取(參照)變數位址。
int a = 1266;
int *ptr; //int *ptr = &a;
ptr = &a;
取值 取值
取值 取值
• 當我們要取值的時候,在指標前面放上星號 * 就可以了!
int *ptr = &a;
printf(“%d\n”, *ptr);
有星號與沒有星號的差別
有星號與沒有星號的差別
有星號與沒有星號的差別 有星號與沒有星號的差別
• 將 ptr 指向變數 a 的位址:
int *ptr;
ptr = &a; // a 必須要是 int
有星號與沒有星號的差別 有星號與沒有星號的差別
• 將 ptr 指向變數 a 的位址:
int *ptr;
ptr = &a; // a 必須要是 int
• 將 ptr 指向指標 b 指向的位址:
int *ptr;
ptr = b; // b 必須要是 int*
是指標?不是指標?
是指標?不是指標?
• int* a, b;
• int *c, d;
• int *e,*f;
是指標?不是指標?
是指標?不是指標?
• int* a, b;
• int *c, d;
• int *e,*f;
• 指標( int* ): a 、 c 、 e 、 f
• 不是指標 (int ): b 、 d
參照小技巧
參照小技巧
參照小技巧 參照小技巧
• 可以讓兩個變數同時代表同一個位址!
• int a = 1266;
• int &b = a;
參照小技巧 參照小技巧
• 可以讓兩個變數同時代表同一個位址!
• int a = 1266;
• int &b = a;
• 此時 a 和 b 是等價的喔!
未來的某一天
未來的某一天
未來的某一天 未來的某一天
dp[i+dx[k]][j+dy[k]]=
((dp[i+dx[k]][j+dx[k]]*arr[p++]+dp[i][j])%MOD+MOD)%MOD;
未來的某一天 未來的某一天
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;
複習一番 複習一番
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
傳值與傳址 傳值與傳址
void swap(int a, int b){
int tmp = a;
a = b;
b = tmp;
}
• 從外面呼叫這個函式會發生什麼事情呢?
傳值與傳址 傳值與傳址
void swap(int *a, int *b){
int tmp = *a;
*a = *b;
*b = tmp;
}
• 加上星號?
傳值與傳址 傳值與傳址
void swap(int &a, int &b){
int tmp = a;
a = b;
b = tmp;
}
• 這樣呢?
陣列與指標
陣列與指標
陣列與指標 陣列與指標
• 陣列其實是一個用指標維護的結構。
陣列與指標 陣列與指標
• 陣列其實是一個用指標維護的結構。
• 宣告時,是宣告陣列的第一項位址和陣列的大小。
int arr[1000];
int *ptr = new int[1000];