在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
复制相似问题