一.int *p1[10] 和 int (*p2)[10] 的区分
int arr[10]; // arr是一个含有是个整数的数组
int *p1[10]; // p1是一个含有10个指针的数组
int (*p2)[10] = &arr; // p2是一个指针,他指向含有十个整数的数组
其中第二行和第三行容易混淆,而且不好理解。
第二行代码可以理解成 (int*) p1[10];,p1[10]即定义了一个数组,而(int*)代表p1数组中含有的是整数指针元素 。
第三行代码则是先阅读括号内的代码,(*p2)表示调用p2时要解引用,因此p2是一个指针,int (*p2)[10];则是代表p2指向的是一个含有是个整数的数组。
二.声明返回数组的指针
和如上数组的声明一样,若想定义一个返回数组指针的函数,则数组的维度必须跟在函数名字之后。然而,函数的形参列表也跟在函数名字后面且形参列表应该先于数组的维度。因此,返回数组指针的函数形式如下所示:
Type (*function (parameter_list)) [dimension] //通常形式
int (*func(int i)) [10]; //具体例子
同样可以按上面的方法来理解该声明的含义
- func(int i) 表示调用func函数时需要一个int类型的实参。
- (*func(int i))意味着我们可以对函数调用的结果执行解引用操作。
- (*func(int i)) [10] 表示解引用func的调用将得到一个大小是10的数组。
- int (*func(int i)) [10]; 表示数组中的元素是int类型。