这个关于结构数组的代码是有效的,但根据我的理解,它是shoudn&#tt。 代码:
#include<stdio.h>
#include<string.h>
int main()
{
struct virus {
char signature[25];
char status[20];
int size;
} v[2] = {
"Yankee Doodle", "Deadly", 1813,
"Dark Avenger", "Killer", 1795
};
for(int i=0;i<=1;i++) {
printf("%s %s\n", &v[i].signature, &v[i].status);
}
return 0;
}
据我所知,当我们尝试使用结构实例的地址访问结构的成员时,我们必须使用->
运算符而不是.
运算符。我知道我们只在一个指针的情况下才这样做,但据我所知,数组在功能上等同于一个指针。请帮助我,我的概念出错。并原谅我的愚蠢问题,因为我只是一个初学者。
答案 0 :(得分:4)
不应该根据Operator Precedence。 []
的优先级高于.
,.
的优先级高于&
。因此&v[i].signature
相当于& ( (v[i]).signature)
。首先, ith 项取自v
,然后访问它的signature
成员,这是一个字符数组,然后&
是applied,给出字符数组的地址。
它适用于VS,但这不是标准行为。
答案 1 :(得分:3)
它确实不起作用。您可能希望&v[i].signature
为(&v[i]).signature
(应该是(&v[i])->signature
),但它实际上是&(v[i].signature)
,类型为char (*)[25]
。如果程序仍然产生预期的输出,那么这纯粹是偶然的。
-Wall
,GCC也会告诉你这个:
$ gcc -c a.c
a.c: In function ‘main’:
a.c:18:9: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[25]’ [-Wformat=]
printf("%s %s\n",&v[i].signature,&v[i].status);
^
a.c:18:9: warning: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘char (*)[20]’ [-Wformat=]
答案 2 :(得分:0)
这是因为:
&v[i].signature == &v[i] == v->signature
(&v).signature == v->signature
您已使用&
获取地址,并使用[]
取消引用。