【问题标题】:What does char (*)[20] in C mean?C 中的 char (*)[20] 是什么意思?
【发布时间】:2020-05-05 13:16:54
【问题描述】:

我知道下面的代码无效,因为 %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", &amp; e. name); | char (*) [20] char *

我很确定char ** 和char (*)[20] 在某种程度上是等价的,但不确定它们是怎样的。

char **:指向一个字符的指针。

char (*)[20]:指向 char 的指针数组。 — 不确定我是否完全正确。

我不明白。它们如何等效?请赐教。

【问题讨论】:

  • @user3121023 请再次阅读问题。
  • char (*)[20] 首先是括号,然后是从右到左:。与char *[20] 比较(无括号,从右到左阅读):.
  • 一些编译器在这方面比其他编译器更挑剔。但是,您可以使用e.name 作为scanf() 的参数,原因与您可以使用e.name 作为printf() 的参数相同。你不需要&amp;。
  • 您的无效行应更改为scanf("%19s", e.name); 或scanf("%19s", &amp;e.name[0]);,因为scanf 的%s 说明符需要char * 参数。 (对于e.name,char [20] 左值将衰减为char *。)

标签: c pointers char


【解决方案1】:

char (*)[20] 类型被读取为“指向char 的大小为 20 的数组的指针。它不是指向char 的指针数组。

指向char 的指针数组(大小为20)将是char *[20]。因为这是一个数组,它可以衰减指向指向数组第一个元素的指针。由于数组的元素是char * 类型,因此这样的指针将具有char ** 类型。

回到您的代码,e.name 的类型为char [20],即char 的大小为20 的数组。从那里可以看出&amp;e.name 的类型为char (*)[20],即指向char 的大小为20 的数组的指针。

【讨论】:

  • 为什么数组的元素是char *类型的?
  • @NirajRaut 在e.name,他们不是。它们的类型为char。你指的是哪种情况?
  • @NirajRaut 如果你有一个char *[20] 类型的变量。这不同于char (*)[20]
  • @NirajRaut 它们不完全是名字。一个是指向char 数组的指针,而另一个是指向char 的指针。 char *[](指向char的指针数组)也不完全相同,但它可以衰减到char **。
  • @NirajRaut 作为函数参数char ** 和char *[] 相同,因为数组作为参数会自动转换为指针。
猜你喜欢
  • 2019-10-17
  • 1970-01-01
  • 2012-04-17
  • 1970-01-01
  • 1970-01-01
  • 2021-10-01
  • 1970-01-01
  • 2017-10-31
  • 1970-01-01
相关资源
最近更新 更多