首页 > 试题广场 >

假设数原型和变量说明如下: void f4(int **p

[单选题]
假设数原型和变量说明如下:
void f4(int **p);
int a[4]={1,2,3,4};
int b[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int *q[3]={b[0],b[1],b[2]};
下面调用合法的是()
  • f4(a);
  • f4(b);
  • f4(q);
  • f4(&a);
推荐
C
根据题干void f4(int **p); f4的参数为指向指针的指针,即p为一个指针的地址指向指针的指针是一种多级间接寻址的形式。
  • 选项A f4(a),参数为一维数组名,即首元素的地址&a[0]。
  • 选项B f4(b),参数为二维数组名,及首元素的地址
  • 选项C f4(q),参数q为一个指针数组,元素为int类型的指针,数组名为首元素b[0]的地址。
  • 选项D f4(&a),参数转化为&a[0]。等同于选项A。
编辑于 2019-08-27 14:14:33 回复(5)
  1. f(a). a 被传入函数形参时, 会退化成指向其首元素的指针, 类型是 int*, 不符.
  2. f(&a). &a 是数组 a 的地址, 其类型是 int(*)[4], 不符.
  3. f(b). b 是数组的数组. b 被传入函数形参时, 会退化成指向其首元素的指针, 也就是 b[0] 的地址, b[0] 的类型是 int[4], 故 &b[0] 类型是 int(*)[4], 不符.
  4. f(q). q 是一个指针数组, 在初始化时, 用 b[0], b[1], b[2] 初始化了, 此时 b[0], b[1], b[2] 会退化成指向各首元素的指针(int* 类型, 因此类型符合, 可以用它们初始化). q 被传入函数形参时, 退化成指向其首元素的指针, 即 int**. 符合
编辑于 2020-07-04 16:26:07 回复(0)

数组名a相当于指向数组第一个元素的指针&a【0】,但是数组名是一个指针常量,也就是说他和常量一样,不能++或—(变量的性质),整形常量和字符常量不占据内存,就更不能取地址了。因此a和&a指向是相同的!

发表于 2020-02-21 22:46:48 回复(0)
q是一个数组名,是指向数组中第一个元素的指针,而第一个元素就是一个指针,所以它相当于指向指针的指针
而b指向数组中的第一个元素,但是它的第一个元素是一个数组,所以它是指向一个数组的指针
发表于 2022-03-18 17:18:59 回复(0)
gcc提示报错是 int*[4] 和int ** 不符合。
发表于 2020-06-09 18:07:39 回复(0)
b选项 int*[4] int ** ;c选项首先 q类型为int* 然后q的类型为int* 所以为int** typeof(a)=typeof(a[0])=typeof(q a[0])=int [4]* typeof(q)=typeof(q q[0])=typeof(q[0])*=typof( q b[0])*=int** q[0]的类型为int*
编辑于 2020-04-21 00:39:11 回复(0)
int b[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int *q[3]={b[0],b[1],b[2]};
针对于c选项,b[0],b[1],b[2]代表每行的指针,是指向每行的数组指针,
他的类型相当于是 int (*p)[4];
int *q[3]={b[0],b[1],b[2]};他这里的q[3]直接就存为int*的类型,
按照上面的说法,q应该是个存放数组指针的数组,类型应该是int (*q[3])[4];
但这个题比较坑,对于 int *q[3]={b[0],b[1],b[2]};
q就是这个数组首元素的地址,首元素里面的存的是个int*类型,其实q的类型就是int**了。
发表于 2023-12-14 10:47:59 回复(0)
int**p是二级指针吗
发表于 2022-03-12 00:22:36 回复(1)