我知道下面的代码是无效的,因为 %s
期待一个类型为 char *
但我给了一个类型为 char **
.
#include <stdio.h>
struct employee
{
int id;
char name[20];
float salary;
};
int main(void)
{
struct employee e;
scanf("%19s", &e.name);//Invalid line
printf("%s", e.name);
}
但我得到一个不同的警告。
./ Playground / file0. c: In function main:. / Playground / file0. c: 11: 15: warning: format '% s' expects argument of type' char * ', but argument2 has type char (*) [20]' [- Wformat =] 11 | scanf ("% 195", & e. name); | char (*) [20] char *
我非常确定 char **
和 char (*)[20]
是有些等价的,但不知道是怎么一回事。
char **
: 指针指向一个char的指针。
char (*)[20]
: 一个指向char的指针数组。- 不知道我的理解是否完全正确。
我不明白。它们是如何等价的?请赐教。
类型 char (*)[20]
读作 "指向大小为20的数组的指针"。char
. 它是 不 的指针数组。char
.
指针数组(大小为20)。char
将是 char *[20]
. 因为这是一个数组,它可以 衰败 为指向数组中第一个元素的指针。 由于数组的元素类型为 char *
,这样的指针将具有 char **
.
回到你的代码。e.name
有型 char [20]
即20个大小的数组,其中 char
. 从这里可以看出: &e.name
有型 char (*)[20]
即指向大小为20的数组的指针。char
.