首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >结构和指针是如何工作的

结构和指针是如何工作的
EN

Stack Overflow用户
提问于 2020-08-23 04:03:56
回答 1查看 219关注 0票数 0

在SoloLearn应用程序中进行测试时,我遇到了一个特定的代码。

代码语言:javascript
运行
复制
#include <stdio.h>
struct node{
    int a, b, c;
};
int main()
{
   struct node num = {3, 5, 6};
   struct node *ptr = &num;
   printf("%d\n", *ptr);
   printf("%d\n", *((int*)ptr + 1 + (3-2)));

    return 0;
}

作为结果打印36,我得到了正确的答案,但我不确定我是否正确地理解了struct语句和指针函数。

下面是我如何理解代码工作方式的步骤。

  1. 由于struct node,num 3,5,6被设置为num变量.

中的a, b, c

  1. *ptr将num的第一个地址指向struct node *ptr = &num;,这意味着它指向索引=0的地址,即{3,5,6}.

中的3地址。

因此,

  1. printf("%d\n", *ptr); prints 3

  1. printf("%d\n", *((int*)ptr + 1 + (3-2)));是打印*(0+1+1),它是num的索引=2,等于6.

是这样的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-23 04:29:37

是的,但是请允许我调整一下你的术语。特别是,在我看来,使用“索引”这个短语似乎有点不太恰当,因为我们不是在谈论数组。我还将分解您的point#4,以便更清楚地了解在那里发生的事情。

由于初始化器,3,5,6被设置为a,b,c,在num variable.

  • ptr中指向由于struct node *ptr = &num;而产生的num的起始地址,这与num.a.

  • Therefore,printf("%d\n", *ptr);打印3.

  • (int*)ptr的地址相同,从而产生一个指向具有正确类型的num.a的指针。

  • add 2 to ptr意味着我们将两个ints的大小添加到地址中。注意,类型广播非常重要,否则我们会将两个struct node的大小添加到地址中;添加到指针的效果取决于指针类型。

  • 结果的地址与num.c的地址相同。在该地址,我们找到6.

的整数值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63543259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档