我只是想确保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]
?
存在一个很好的网站解码这样的原型: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
它们是不同的类型:
char *a[5]; // array of 5 char pointers. char (*a)[5]; // pointer to array of 5 chars.
在第一个示例中,您获得了一个指针数组,因为括号在解析时优先.通过将星号放在括号内,您可以覆盖它并显式地将指针置于更高的优先级.
您使用括号使指针指示符*
"更接近"变量,这会改变声明的含义:而不是指针数组,您将获得指向数组的单个指针.
以下是如何使用它:
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上演示.