不然好像每次寫指標都在重新查怎麼寫 QuQ
當然寫法只是一種 style 並不強制
正文開始 OuO
Pointer 寫法
下面這三種都是合法的宣告int* a; int *a; int * a;
不過建議使用
int *a;
原因有下:
在同時宣告多變數時,例如:
int *a, b;
此時 b 並不會變成 int 的指標,而是 int
這是因為這樣宣告是代表 (*a)、(b) 是兩個 int 的變數
而 a 就會變成 int 的指標了
去 linux 的原始碼逛逛後也發現寫法是這樣
但還是建議每個變數各自宣告
int *a; int b;
Pointer 念法
念法的部分呢 (這裡就省略冠詞 OuOint *a; // a 是指向整數的指標 (pointer to integer)
int **a; // a 是指向整數的指標的指標 (pointer to pointer) // 注意! 沒有什麼雙指標
int b = *a; // (*a) 是 a 所指向的數值 (value of a)
int *a = &b; // &b 是 b 所在的記憶體位置 (address of b)
小練習
#include <stdio.h> int main(){ int a = 3; int *i; i = &a; printf("%p -> %d\n", i, *i); int *j = &a; printf("%p -> %d\n", j, *j); return 0; }
0xffffcbfc -> 3 0xffffcbfc -> 3
Struct
加入 struct 後宣告、取值跟取址都上面一樣
但是對成員操作就會有兩種方式
兩種寫法都不建議在左右加空白
一種是透過物件
a.x; // a 的成員 b (member x of object a)一種是透過指向物件的指標
ptr = &a; ptr->x; // ptr 所指向的成員 (member x of object pointed to by ptr) // 等價於 (*ptr).x 先向 ptr 取值再取成員
小練習
#include <stdio.h> typedef struct { int x; int y; } Point; int main(){ Point a = {4, 6}; printf("(%d, %d)\n", a.x, a.y); Point *ptr = &a; printf("(%d, %d)\n", ptr->x, ptr->y); printf("(%d, %d)\n", (*ptr).x, (*ptr).y); return 0; }
(4, 6) (4, 6) (4, 6)
參考資料:
Correct way of declaring pointer variables in C/C++ [closed]
沒有留言:
張貼留言