#include<iostream> using namespace std; //在函数中, 数组退化为指针, 所以int *[4]在函数中实际相当于int **,与4无关 int fun(int *p[4]){ int sum = 0; for(int i=0; i<5; i++) sum += *p[i]; return sum; } int main(){ int arr[5] = {1,2,3,4,5}; int *parr[5] = {arr, arr+1, arr+2, arr+3, arr+4}; int **xxx = parr; //parr类型int *[5],传递给fun()时会检查parr能否传递给 //形参类型int *[],这里显然是可以传递的。 //而进入函数后 形参p将退化为int ** cout << fun(parr) << endl; //正确 cout << fun(xxx) << endl; //正确 return 0; }
int a;
int *p = &a; //相当于int *p;p = &a;
//a是int,p是int*,定义指向a的指针p多了一个*
int *a;
int **p = a;
//a是int*,p是int**,定义指向a的指针p多了一个*
int a[4];
int * p = a; //相当于int *p,p = a;
//这里不用&取地址符,a的类型相当于int *
//题目中fun的参数是:
int *p[4];
//这里的数组的类型是int *,所以p的类型相当于int **
//p+1:指向数组的下一个元素,p的值加上int*的长度;
A. int a[4][4];
//a的类型是:int (*p)[4]; //p是一个指针,指向一个有4个int元素的数组
//p+1:p的值加了4个int的长度,即指向了数组的下一行
B. int **a;
//a的类型是int**,B正确。
C. int **a[4];
//a是一个数组,数组元素是int**类型,所以a的类型相当于int***
D. int (*a)[4];
//a是一个指针,指向一个4个int元素的数组
//a+1:要加4个int的长度
二维指针和二级指针的区别 二维数组指针形式相当于一级指针,因为它可以通过指针的偏移量访问所有的元素。 int *a[4] a指向数组,数组里面存放的是int*,可以看做是二级指针 int** a[4] a指向数组,数组里面存放的是二级指针,a可以看做三级指针 int (**a)[4] a是一个二级指针,数组里面存放int型 int (*a)[4]; a是个一级指针,数组里面存放int型 int(*a)[4]和int a[4]的区别在于一个是指针,一个是数组名 记住类似于int** (**a)[4]在int/doulble等type类型后面描述的是数组存储的类型,括号里面是指针的级别 此题需要的是二级指针
int a[4][4];
int **a;
int **a[4]
int (*a)[4];
B. int **a; 这是一个指向指针的指针,即二级指针,它可以作为int *p[4]的参数。在这种情况下,p是一个指向指针的数组,而a是一个指向指针的指针,因此它是一个合法的参数。
D. int (*a)[4]; 这是一个指向长度为4的整数数组的指针。同A