为什么这些代码在结构数组上工作?

时间:2014-05-26 09:08:08

标签: c++ c arrays struct

这个关于结构数组的代码是有效的,但根据我的理解,它是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;
}

据我所知,当我们尝试使用结构实例的地址访问结构的成员时,我们必须使用->运算符而不是.运算符。我知道我们只在一个指针的情况下才这样做,但据我所知,数组在功能上等同于一个指针。请帮助我,我的概念出错。并原谅我的愚蠢问题,因为我只是一个初学者。

3 个答案:

答案 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

您已使用&获取地址,并使用[]取消引用。