C struct指针访问字段

阿克斯55

我已经读过,如果我们有一个指向结构类型对象的指针,我们将无法使用星号(*)访问对象字段,但是我们需要使用它->(如箭头符号)。

现在,尽管我了解了它,但我不明白为什么我们不能使用星号,但我将尝试提供一个代码示例和一个图片,说明我如何可视化内存中的结构以帮助您了解导致我无法理解的内容这个话题。

好的,这是我们的代码:

#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),您尝试在指针上使用点运算符,这会失败。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章