实现一个程序时,想要写出“指向数组指针的数组”的声明。完整地说,我想声明一个3元素数组,元素类型为“指向char[64]的指针”。
为什么想指定数组维度?比如arr是这个指针数组,如果能声明维度,*arr[0]的类型就是“char[64]”,sizeof(*arr[0])就能获得数组的长度。
一下还写不出来,尝试几番,总算让sizeof(*arr[0])返回64了。声明的样子是:
char (*arr[3])[64]
以前以为看完C语言专家编程关于声明的那些内容,就不会被类似问题难住。其实,还是很少自主去思考这些东西。这个声明的意思是,arr是个3元素数组,元素类型是指针,指针类型是char[64]。即指向char[64]指针的数组。
如果不要括号就成了,arr是个3元素数组,元素类型是64元素数组,此64元素数组里的元素类型是指针,指针指向的类型是char。
不同之处是,3元素数组里元素类型改变了。声明里[]比*的优先级高,不括起来的话,元素类型就是[]而不是*了。
如果改变一下括号:
char (*arr)[3][64]就成了,素数arr是一个指针,指针指向的类型是某个3元组,3元素数组之元素类型为某64元素数组,64元素数组之元素类型为char。
三种情况依次是,“指向数组指针”的数组,“char*指针数组”的数组,指向“char数组的数组”的指针。
声明倒是做出来了,结果用的时候警告不断:大部分函数都是要char*,而传入的是char(*)[64]。
C语言的类型系统果然蛋疼。