解读c的声明
1 首先着眼于标识符(变量名或者函数名)
2 从距离标识符最近的地方开始,依照优先顺序解释派生类型(指针,数组和函数)
优先顺序如下:
(1)用于整理声明内容的括弧
(2)用于表示数组的[],用于表示函数的()
(3)用于表示指针的*
例如
int (*func_p)(double)
为:func_p是指向返回int类型的函数的指针
double(*hoge)[3]
为:hoge是指向返回double类型的数组(元素个数为3)的指针
int fun(int a)
为:fun是指向返回int类型的函数(参数为int a)
int (*func_a)(int a)
为:func_a是指向返回为int类型的函数(参数为int a)
int (*func_table[10])(int a)
为:指向返回为int类型的参数(参数为int a)的指针数组(元素个数10 )
c语言中不存在多维数组
例如我们声明一个多维数组int hoge[3][2]
那么这个声明的解读应该是 int的数组(元素个数2)的数组(元素个数3)

读《征服c指针》有感——声明和数组
所以int hoge[3][2]可以用hoge[i][j]来访问,此时hoge[i]是数组(元素个数2)的数组(元素个数3)的第i个元素,其类型是“int 数组(元素个数2)”所以此刻hoge[i]可以被解读成指向int 的指针

而我们将数组作为参数传递的时候,可以直接传递指向int类型的指针,这是因为在表达式里,数组可以解释成指针。

int的数组(元素个数2)的数组(元素个数3)中**数组(元素个数3)**在表达式中可以解释成指针,向函数传递指向int的数组(元素个数2)的指针

说白了就是指向数组的指针

void func(int hoge[][2])
void func(int hoge[3][2])
void func(int (*hoge)[2])
这三种写法完全相同。

读完之后我觉得完全颠覆了我之前对于c数组的理解,c语言博大精深啊!

相关文章: