訪問運算子
成員訪問操作符(dot .
和 arrow ->
)用於訪問 struct
的成員。
物件的成員
計算表示作為被訪問物件成員的物件的左值。
struct MyStruct
{
int x;
int y;
};
struct MyStruct myObject;
myObject.x = 42;
myObject.y = 123;
printf(".x = %i, .y = %i\n", myObject.x, myObject.y); /* Outputs ".x = 42, .y = 123". */
指向物件的成員
用於解除引用的語法糖,然後是成員訪問。實際上,x->y
形式的表示式是 (*x).y
的簡寫 - 但是箭頭操作符更清晰,特別是如果結構指標是巢狀的。
struct MyStruct
{
int x;
int y;
};
struct MyStruct myObject;
struct MyStruct *p = &myObject;
p->x = 42;
p->y = 123;
printf(".x = %i, .y = %i\n", p->x, p->y); /* Outputs ".x = 42, .y = 123". */
printf(".x = %i, .y = %i\n", myObject.x, myObject.y); /* Also outputs ".x = 42, .y = 123". */
地址的
一元 &
運算子是運算子的地址。它計算給定的表示式,其中結果物件必須是左值。然後,它計算一個物件,其型別是指向結果物件型別的指標,幷包含結果物件的地址。
int x = 3;
int *p = &x;
printf("%p = %p\n", (void *)&x, (void *)p); /* Outputs "A = A", for some implementation-defined A. */
提領
一元*
運算子取消引用指標。它計算從解除引用評估給定表示式得到的指標得到的左值。
int x = 42;
int *p = &x;
printf("x = %d, *p = %d\n", x, *p); /* Outputs "x = 42, *p = 42". */
*p = 123;
printf("x = %d, *p = %d\n", x, *p); /* Outputs "x = 123, *p = 123". */
索引
索引是指標新增的語法糖,然後是解除引用。實際上,形式 a[i]
的表示式相當於*(a + i)
- 但顯式的下標符號是首選。
int arr[] = { 1, 2, 3, 4, 5 };
printf("arr[2] = %i\n", arr[2]); /* Outputs "arr[2] = 3". */
索引的可互換性
新增指向整數的指標是可交換操作(即運算元的順序不會改變結果)所以 pointer + integer == integer + pointer
。
其結果是 arr[3]
和 3[arr]
是等價的。
printf("3[arr] = %i\n", 3[arr]); /* Outputs "3[arr] = 4". */
通常不建議使用表示式 3[arr]
而不是 arr[3]
,因為它會影響程式碼的可讀性。它在混淆的程式設計競賽中往往很受歡迎。