[英]C struct pointer accessing fields
我已經讀過,如果我們有一個指向結構類型對象的指針,我們就不能通過使用星號(*)訪問對象字段,但我們需要使用它 - >(如箭頭符號)。
現在雖然我讀到它但我不明白為什么我們不能使用星號,我會嘗試提供一個代碼示例和一個圖片,說明我如何在內存中可視化結構,以幫助您了解阻止我理解的內容這個話題。
好的,所以這是我們的代碼:
#include <stdio.h>
typedef struct MyStruct
{
char c1;
char c2;
} MyStruct;
int main()
{
MyStruct s1; // Let's assume s1's address is 0x34A
s1.c1 = 'A';
s1.c2 = 'B';
printf("s1 c1 is %c and c2 is %c.\n", s1.c1, s1.c2);
MyStruct *p = &s1; // Declaring our pointer to point to s1 address, so p points to 0x34A
printf("s1 c1 is %c and c2 is %c.\n", p->c1, p->c2); // I know this is the valid way
printf("s1 c1 is %c.\n", *p.c1); // I don't understand why this would be invalid
return 0;
}
現在讓我試着解釋為什么我不明白為什么這種語法無效。 所以p指向s1的地址,即0x34A,正如我所看到的,這就是我在內存中看到s1的方式:
所以我在內存中想象的是,s1當然有自己的地址,在我們的示例中是0x34A,它指向內存中的c1地址,后跟c2地址。 所以當我這樣做時:
printf("s1 c1 is %c.\n", (*p.c1)++, *p.c2);
我想到它,因為我正在通過指針訪問指針地址內的值,所以我們訪問的值是c1。
但正如我所說它無效而我只是試圖理解為什么,我試圖閱讀它,但無法真正指出答案,這將滿足我為什么真的,所以我提供了代碼示例和圖片,所以你可以進入我的腦海,試着看看為什么我在這里想錯了。
*p.c1
被解析為*(p.c1)
而不是(*p).c1
。
所以當你執行*(p.c1)
,你試圖在指針上使用點運算符,這會失敗。
這里有一個優先問題。 如果你想這樣訪問,那么去(* p).c1。 現在通過做(* p),您將到達您的結構,然后到達成員之后。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.