Что означает char (*) [20] в C? - PullRequest
1 голос
/ 05 мая 2020

Я знаю, что приведенный ниже код недействителен, поскольку %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. - Не уверен, что я здесь совершенно прав.

Я не понимаю. Насколько они эквивалентны? Просвети меня, пожалуйста.

1 Ответ

0 голосов
/ 05 мая 2020

Тип char (*)[20] читается как «указатель на массив размером 20 из char. Это не массив указателей на char.

массив ( размером 20) указателей на char будет char *[20]. Поскольку это массив, он может распадаться на указатель на первый элемент массива. Поскольку элементы массива имеют тип char *, такой указатель будет иметь тип char **.

Возвращаясь к вашему коду, e.name имеет тип char [20], т.е. массив размером 20 из char. Отсюда следует, что &e.name имеет тип char (*)[20], т.е. указатель на массив размером 20 из char.

...