C - struct中的指针不影响代码

时间:2017-01-21 17:55:16

标签: c pointers struct

我试图理解为什么这段代码有效

#include<stdio.h>
struct identity {
    int age;
    char name[20];
} test;
int main(void) {
    printf("Enter name: ");
    scanf("%s", &test.name);
    printf("Enter age: ");
    scanf("%d", &test.age);
    printf("NAME: %s", test.name);
    printf("\nAGE: %d", test.age);
}

即使我这样定义结构:

struct identity {
        int *age;
        char *name[20];
    } test;

无论我如何写它,它都有效。我可以理解它是这样工作的,但是为什么我使用指针呢?
我的意思是,它不应该需要printf("NAME: %s", *test.name);printf("\nAGE: %d", *test.age);所以至于分别打印test.nametest.age地址内的值?

这是在结构中使用指针的错误方法吗?因此它有效,因为我实际上不使用指针?

3 个答案:

答案 0 :(得分:1)

这是因为当您* age作为数组工作时,char name[20]作为2D数组工作。如果你放置array[]某个array2d[][]array,那么这是你的第一个元素array[0],当你放array2d时,这是你的第一首诗(array[0][])。您也可以执行*(array+1),这与array[1]相同。

答案 1 :(得分:1)

我觉得int在今天的计算机上适合int *的空间,因此你可以将int值放在int var的地址空间中,而不会破坏struct的其他值。我把它添加到main():

rails c

并在我的系统上获得此输出: sizeof int:4 sizeof int *:8

在我看来,为什么当使用指针变量代替变量本身时它才起作用?

答案 2 :(得分:0)

像许多其他问题一样,如果你注意编译器警告,那么你应该清楚。当您将两个struct成员更改为指针时,您会收到以下编译器警告:

str.c:11:5: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char **’ [-Wformat=]
     printf("NAME: %s", test.name);
     ^
str.c:12:5: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat=]
     printf("\nAGE: %d", test.age);

这是什么意思?因此,您已将其更改为2D字符数组和整数数组(或int *)。它仍然有效,因为它们的起始地址仍然相同。因此,仅使用起始地址访问变量或指针会产生相同的结果。但是,如果您执行了类似的操作,则会注意到区别

test.age++

如果ageint,则将该值递增1.如果ageint*,则递增指向下一个广告位的指针(sizeof) (int)增量)。