C/C++定义指针与数组时的优先级问题
指针与数组
首先记住:括号的优先级大于星号。因此:
1 |
|
另一个典型的例子是,main函数中常见的传参写法:
1 |
|
类似地,对于函数指针,规则也一样适用:
1 |
|
第二条规则,中括号和小括号优先级一样。他们都是从左向右求值。
1 |
|
函数指针
注意区分函数和函数指针。
1 |
|
不要混淆func
和&func
的用法,虽然很多时候两者通用。
现在可以丧心病狂一点,把函数、指针和数组结合起来。但是注意,不能建立函数的数组,只能建立函数指针的数组。
1 |
|
挑战一下,吴总给的两个例子:
1 |
|
数组指针的运算
记住指针运算的规则:指针加一,地址增加一个元素的大小。得到的指针类型不变。
1 |
|
对于指向定长数组的指针,分配内存的方式如下:
1 |
|
与const的结合
我没有查到标准里关于const的规则。网上大多的说法是:const先左结合,如果左边没有了就右结合。
先看一级指针。这两种写法是等价的:
1 |
|
再看二级指针。
1 |
|
再加上数组。
1 |
|
cdecl
这个网站可以将诸如int *p(int (*)[10])
之类的复杂定义转换成英语。
目前已经支持指针数组、函数指针、const。不过不支持typedef,不支持多个标识符名,功能还是有点鸡肋。
题外话:数组到指针的转换
以前上课学过,在函数传参的时候,一维数组可以转换为一级指针。
这里可以理解为,int[N]
可以转换为int*
类型,而int(*)[N]
则不可以。因为前者指向的是单个元素,而后者指向的是N个元素组成的一块。
1 |
|
实际上,数组作为函数参数传递后会退化会指针。
1 |
|
参考文章
c - Typedef function and is it useful? - Stack Overflow
c - correct way to assign function pointer - Stack Overflow
Declaring an array of functions of type void C++ - Stack Overflow
c++ - What is the difference between const int*, const int* const, and int const* ? - Stack Overflow