107.08.04 c 的指標怎麼寫怎麼念

<注意> 本文不是教指標怎麼用,而是記錄一下寫法和念法
不然好像每次寫指標都在重新查怎麼寫 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 念法

念法的部分呢 (這裡就省略冠詞 OuO
int *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]

沒有留言:

張貼留言

^ Top