簡體   English   中英

C結構指針訪問字段

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM