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

时间:2014-06-07 14:49:19

标签: c arrays pointers

我只是想确保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 个答案:

答案 0 :(得分: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

答案 1 :(得分:5)

它们是不同的类型:

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

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

答案 2 :(得分: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

Demo on ideone.

答案 3 :(得分:3)

char *a[5];
创建一个包含5个指向char

的指针的数组

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

char (*a)[5]
创建一个包含5个char的数组,并为此创建的数组的第一个元素的地址分配a

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