【问题标题】:what is difference between defining char a[5] and char (*a)[5]? [duplicate]定义 char a[5] 和 char (*a)[5] 有什么区别? [复制]
【发布时间】:2014-07-28 16:51:03
【问题描述】:

我只是想确定 C 语言中 *a[5] 和 (*a)[5] 的区别。

我知道 *a[5] 表示数组 a 可以有五个元素,每个元素都是指针。 所以,

char *p = "ptr1";
char *p2 = "ptr2";
char *a[5] = { p , p2 };

确实有道理。

但是当我将*a[5] 更改为(*a)[5] 时,它不起作用。

char (*a)[5] = { p , p2};

(*a)[5] 到底是什么意思?


另外,

*a[5]a[5][](*a)[5]a[][5]之间有什么区别吗?

【问题讨论】:

    标签: c arrays pointers


    【解决方案1】:

    有一个很棒的网站可以解码这样的原型:http://cdecl.org/

    char *a[5]   --> declare a as array 5 of pointer to char
    char a[5][]  --> declare a as array 5 of array of char
    char (*a)[5] --> declare a as pointer to array 5 of char
    char a[][5]  --> declare a as array of array 5 of char
    

    【讨论】:

      【解决方案2】:

      它们是不同的类型:

      char *a[5];   // array of 5 char pointers.
      char (*a)[5]; // pointer to array of 5 chars.
      

      在第一个示例中,您得到了一个指针数组,因为解析时括号优先。通过将星号放在括号内,您可以覆盖它并显式地将指针置于更高的优先级。

      【讨论】:

      • 请注意,OP 没有将第二条语句写为声明,而是作为赋值。
      • @user2485710 是的,我认为他是故意的。在我看来,这样更有意义。无论如何,阿米尔已经得到了另一个案例的答案。
      【解决方案3】:

      您使用括号使指针指示符*“更接近”变量,这改变了声明的含义:而不是一个指针数组,您得到一个单个指向一个数组。

      这里是你如何使用它:

      char x[5]={'a','b','c','d','e'};
      char (*a)[5] = &x;
      printf("%c %c %c %c %c\n", (*a)[0], (*a)[1], (*a)[2], (*a)[3], (*a)[4]);
      

      注意编译器知道a指向一个数组:

      printf("%z\n", sizeof(*a)); // Prints 5
      

      Demo on ideone.

      【讨论】:

        【解决方案4】:

        char *a[5];
        创建一个包含 5 个指向 char 的指针的数组

        printf("%c",*a[5])
        a 是一个指针数组
        所以这个表达式的意思是打印a[5]指向的第六个元素字符值。

        char (*a)[5]
        创建一个包含 5 个字符的数组并将 a 分配给这个创建的数组的第一个元素的地址

        printf("%c",(*a)[5])
        a 指向字符数组的第一个元素
        所以这个表达式的意思是打印a指向的数组的第六个字符元素值。

        【讨论】:

          猜你喜欢
          • 2020-07-29
          • 1970-01-01
          • 2020-05-03
          • 2014-11-05
          • 2012-03-16
          • 1970-01-01
          • 1970-01-01
          • 2018-06-27
          • 2012-08-14
          相关资源
          最近更新 更多