在SoloLearn应用程序中进行测试时,我遇到了一个特定的代码。
#include <stdio.h>
struct node{
int a, b, c;
};
int main()
{
struct node num = {3, 5, 6};
struct node *ptr = #
printf("%d\n", *ptr);
printf("%d\n", *((int*)ptr + 1 + (3-2)));
return 0;
}作为结果打印3和6,我得到了正确的答案,但我不确定我是否正确地理解了struct语句和指针函数。
下面是我如何理解代码工作方式的步骤。
struct node,num 3,5,6被设置为num变量.中的a, b, c。
*ptr将num的第一个地址指向struct node *ptr = #,这意味着它指向索引=0的地址,即{3,5,6}.中的3地址。
因此,
printf("%d\n", *ptr); prints 3,printf("%d\n", *((int*)ptr + 1 + (3-2)));是打印*(0+1+1),它是num的索引=2,等于6.是这样的吗?
发布于 2020-08-23 04:29:37
是的,但是请允许我调整一下你的术语。特别是,在我看来,使用“索引”这个短语似乎有点不太恰当,因为我们不是在谈论数组。我还将分解您的point#4,以便更清楚地了解在那里发生的事情。
由于初始化器,3,5,6被设置为a,b,c,在num variable.
ptr中指向由于struct node *ptr = #而产生的num的起始地址,这与num.a.
printf("%d\n", *ptr);打印3.
(int*)ptr的地址相同,从而产生一个指向具有正确类型的num.a的指针。
ptr意味着我们将两个ints的大小添加到地址中。注意,类型广播非常重要,否则我们会将两个struct node的大小添加到地址中;添加到指针的效果取决于指针类型。
num.c的地址相同。在该地址,我们找到6.的整数值。
https://stackoverflow.com/questions/63543259
复制相似问题