定义char a[5]和char (*a)[5]有什么区别?

5

我希望确保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] 之间有什么区别吗?

4个回答

6
一个很好的网站可以解码这样的原型: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

5

它们是不同的类型:

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

在第一个例子中,由于在解析时方括号具有优先级,因此您得到了指针数组。将星号放在括号内部可以覆盖它,并明确地将具有更高优先级的指针引入其中。

请注意,OP没有将第二个语句写成声明,而是写成了赋值。 - user2485710
@user2485710 是的,我认为他本来就是这个意思。在我看来,这样更有道理。无论如何,阿米尔已经得到了另一个情况的答案。 - AliciaBytes

5

使用括号可以使指针标识符*“靠近”变量,从而改变声明的含义:不再是指向指针的数组,而是得到一个指向数组的单个指针。

以下是如何使用它:

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

点击此处查看ideone上的示例程序


3

char *a[5];
创建一个指向字符的指针数组,数组包含5个元素。

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

char (*a)[5]
创建一个包含5个字符的数组,并将a赋值为该创建数组的第一个元素的地址。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接