我试图理解为什么这段代码有效
#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.name
和test.age
地址内的值?
这是在结构中使用指针的错误方法吗?因此它有效,因为我实际上不使用指针?
答案 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++
如果age
为int
,则将该值递增1.如果age
为int*
,则递增指向下一个广告位的指针(sizeof) (int)增量)。