繁体   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