首页 > 试题广场 >

函数fun的声明为int fun(int *p[4]),以下

[单选题]
函数fun的声明为int fun(int *p[4]),以下哪个变量可以作为fun的合法参数()
  • int a[4][4];
  • int **a;
  • int **a[4]
  • int (*a)[4];
答案:B
可以看出fun函数的形参是一个指针数组,也就是指针指向一个地址,地址中存放的内容也是指针。
A,二维数组,不符合
B,二级指针,也就是指针指向的内容也还是存放指针的,符合
C,二级指针数组,数组的内容是二级指针,不符合
D,数组指针,不符合
发表于 2015-01-27 21:48:33 回复(10)
解答一下A为什么是错的:
1.G++4.8.4
源码:int func(int* p[4]) {return 0;}
 int main() {int a[4][5]; func(a);  return 0;}
编译出错:
te.cpp:22:11: error: cannot convert ‘int (*)[5]’ to ‘int**’ for argument ‘1’ to ‘int func(int**)’
     func(a);
原因:
函数参数形参是一个指向指针的指针(作为参数时与数字4无关,相当于int**),
而a[4][5],把a作为参数传入时得到int (*)[5]是一个数组指针,该指针指向一个数组,并且这个数组长度为5,存储类型为int。
(a[4][5]含义:该数组a拥有4个数组类型的元素,其中每个元素都是一个拥有5个整型元素的数组。)
编辑于 2015-08-16 15:50:49 回复(3)
#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;
}



编辑于 2015-07-31 11:52:53 回复(1)

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的长度

发表于 2016-05-01 15:10:48 回复(3)
int *p[4]表示p为指向数组的指针,数组中的元素类型为int。int (*a)[4]表示int *类型的指针的数组,数组的大小为4。
选B
编辑于 2015-08-25 07:27:09 回复(6)
比如,整型数组int a[4]作形参,我们可以写成int *a或者int a[];同理,指针数组int* a[4]作形参,我们可以写成int **a或者int *a[]。
发表于 2017-09-24 02:02:54 回复(0)
数组作为函数参数时退化为指针,指针的指针  所以是二级指针
发表于 2017-06-23 08:41:02 回复(0)
http://www.cnblogs.com/mq0036/p/3382732.html,这个博客把数组指针和指针数组解释得很清楚
发表于 2015-07-27 22:40:06 回复(0)
二维指针和二级指针的区别 二维数组指针形式相当于一级指针,因为它可以通过指针的偏移量访问所有的元素。 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类型后面描述的是数组存储的类型,括号里面是指针的级别 此题需要的是二级指针

编辑于 2016-03-17 22:07:14 回复(0)
数组传参时会退化为指针
发表于 2022-05-14 19:33:59 回复(0)

类比一维:
fun(int *p)<====>fun(int p[])
可得二维:
fun(int* *p)<===>fun(int* p[])

发表于 2020-06-14 21:26:30 回复(0)

1、int(*p)[4];------ptr为指向含4个元素的一维整形数组的指针变量(是指针),数组指针

2、int *p[4];-------定义指针数组p,它由4个指向整型数据的指针元素组成(是数组),指针数组

1中p先与*结合,那就说明p本质是一个指针;而2中p先与后面的[4]结合,说明他本质是一个数组。显然选项A、选项D错误;

C、int ** a[4] 二级指针数组,数组的内容是二级指针,选项C错误;

而 int* p[4],是一个指针数组,当形参为该类型时,需要传入指针的指针,即二级指针。选项B正确。

编辑于 2018-07-04 16:58:32 回复(0)
指针数组typeof(int*a[10])===>>int **和数组指针的类型不同typeof(int a[10][10])===>>int (*a)[10]
发表于 2017-09-21 22:43:35 回复(0)
注意int* p[4],是一个指针数组,当形参为该类型时,需要传入指针的指针,即二级指针。另外,二级指针和二维指针(数组指针)是不一样的,注意区别。
发表于 2017-01-26 15:31:59 回复(0)
参数类型 int *p[4]退化为int **p,最让我不解的是int   a[4][4];为什么不行,因为 int  a[4][4]的类型是 int(* p)[4]
发表于 2015-10-20 11:06:34 回复(0)
int *p[4],p表示的是数组指针的首地址,相当于二级指针,所以传入的也必须是相同类型 即int**类型,B
发表于 2015-08-18 16:45:10 回复(0)
jdk头像 jdk
B
*p[4]为指针数组,即p数组中的每个元素都为一个一级指针,则p为二级指针。所以B为合法参数。
发表于 2015-01-22 20:23:44 回复(0)
b
声明语句中形参中数组相当于指针, 则实际形参p 为类型为 int ** 的二级指针
发表于 2015-01-21 12:55:05 回复(0)
int *p[4]是指针数组,也就是说p是指向数组的指针,数组里都是指针,所以是指向指针的指针;

A. int a[4][4]; 这是一个二维数组的声明,可以表示一个4行4列的整数数组。
a是一个二维数组,而不是指向指针的数组,是数组指针。即int (*a)[4]指向4个数组

B. int **a; 这是一个指向指针的指针,即二级指针,它可以作为int *p[4]的参数。在这种情况下,p是一个指向指针的数组,而a是一个指向指针的指针,因此它是一个合法的参数。

C. int **a[4] 这是一个指针数组,每个元素都是指向指针的指针。int **a[4]是一个数组,包含4个元素。每个元素都是一个指向指针的指针,即int类型的指针的指针。因此,a是一个指向指针的数组的数组。这种类型的数组通常用于表示二维数组或者多维数组。
指针数组,里面保存的是指向指针的指针,int *a[4]。

D. int (*a)[4]; 这是一个指向长度为4的整数数组的指针。同A

编辑于 2023-11-15 10:54:39 回复(0)
函数fun的声明为int fun(int *p[4]),以下哪个变量可以作为fun的合法参数()
  • int a[4][4];
  • int **a;
  • int **a[4]
  • int (*a)[4];
int fun(int arr[]);形参是一个数组,arr可以接收int类型的指针
int fun(int*p[4]);形参是一个数组,等价int fun(int* *p);
A选项,a是数组名,表示首元素地址,也就是第一行一维数组的地址(数组指针),应该用int (*p)[4]作为形参接收
B选项,a是二级指针,可以作为int*p[4]形参接收,相当于值传递
C选项,a是数组名,表示首元素地址,即二级指针的地址,应该用int***p作为形参接收
D选项,a是数组指针,同A选项,应该用int (*p)[4]作为形参接收

发表于 2023-04-29 22:15:23 回复(0)