首页 > 试题广场 >

已知数组D的定义是int D[4][8];,现在需要把这个数

[不定项选择题]
已知数组D的定义是int D[4][8];现在需要把这个数组作为实参传递给一个函数进行处理。下列可以作为对应的形参变量说明的是()。
  • int D[4][]
  • int *s[8]
  • int(*s)[8]
  • int D[][8]
推荐
二维数组在内存中也是连续存储的,他可以通过 arr[i][j]寻址是因为我们定义了这个数组有多少列,
加入有N列,这样数组寻址的时候编译器会自动得到 *(arr+(j*N)+i)所以传参数的时候列数必须指定。
所以D正确A不正确。B表示有8个指向int指针的数组,不对,而C中(*s)等价于s[]。因此答案CD;

编辑于 2017-08-08 11:12:44 回复(2)
int *s[8]; //定义一个指针数组,该数组中每个元素是一个指针,每个指针指向哪里就需要程序中后续再定义了。
int (*s)[8]; //定义一个数组指针,该指针指向含8个元素的一维数组(数组中每个元素是int型)。

区分int *p[n]; 和int (*p)[n]; 就要看运算符的优先级了。
int *p[n]; 中,运算符[ ]优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组。
int (*p)[n]; 中( )优先级高,首先说明p是一个指针,指向一个整型的一维数组。
编辑于 2015-09-07 22:35:12 回复(2)
选CD
数组作为实参时必须指定列数,否则可能产生歧义,所以D正确
C是数组指针,每个都指向对应的数组的每列
发表于 2015-08-12 13:36:49 回复(6)
d:  编译原理这门课程我们知道编译器是这样处理数组的:
    对于数组 int p[m][n];
    如果要取p[i][j]的值(i>=0 && i<m && 0<=j && j < n),编译器是这样寻址的,它的地址为:
    p + i*n + j;
    从以上可以看出,如果我们省略了第二维或者更高维的大小,编译器将不知道如何正确的寻址。a不对, d对。




发表于 2016-04-01 16:39:34 回复(2)
首先二维数组可以由列数确定,其次注意数组指针和指针数组的区别: 数组指针和指针数组的区别 数组指针(也称行指针) 定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。 如要将二维数组赋给一指针,应这样赋值: int a[3][4]; int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。 p=a; //将该二维数组的首地址赋给p,也就是a[0]或&amp;a[0][0] p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][] 所以数组指针也称指向一维数组的指针,亦称行指针。 指针数组 定义 int *p[n]; []优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1时,则p指向下一个数组元素,这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。 如要将二维数组赋给一指针数组: int *p[3]; int a[3][4]; p++; //该语句表示p数组指向下一个数组元素。注:此数组每一个元素都是一个指针 for(i=0;i&lt;3;i++) p[i]=a[i] 这里int *p[3] 表示一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2] 所以要分别赋值。 这样两者的区别就豁然开朗了,数组指针只是一个指针变量,似乎是C语言里专门用来指向二维数组的,它占有内存中一个指针的存储空间。指针数组是多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间。
编辑于 2016-01-09 15:32:34 回复(0)
唉,我一个玩Java,这样好吗
发表于 2017-09-10 09:17:20 回复(0)
数组作为实参时必须指定列数,否则可能产生歧义,而不是指定行数

发表于 2016-04-26 14:29:33 回复(0)
int *s[8]; //定义一个指针数组,该数组中每个元素是一个指针,每个指针指向哪里就需要程序中后续再定义了。 int (*s)[8]; //定义一个数组指针,该指针指向含8个元素的一维数组(数组中每个元素是int型)。 区分int *p[n]; 和int (*p)[n]; 就要看运算符的优先级了。 int *p[n]; 中,运算符[ ]优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组。 int (*p)[n]; 中( )优先级高,首先说明p是一个指针,指向一个整型的一维数组。
发表于 2017-09-26 20:17:28 回复(0)
应当传入的参数是一个指向一维数组的指针,故选CD。
发表于 2018-11-18 18:20:58 回复(0)
案:D
二维数组在内存中也是连续存储的,他可以通过 arr[i][j]寻址是因为我们定义了这个数组有多少列,加入有N列,这样数组寻址的时候编译器会自动得到 *(arr+(j*N)+i)所以传参数的时候列数必须指定。所以D正确A不正确
B选项会把数组前8个元素作为数组8个行的首地址,这样明显不正确,因为前8个元素是数组的值,不是地址,C选项不正确
发表于 2015-01-26 20:19:52 回复(4)
涯头像
D

C和D都能完成参数传递,单由于指定了作为实参传递,因此选D
发表于 2015-01-05 13:16:27 回复(1)
不好意思的挠挠头,选了AB
发表于 2020-10-10 22:28:21 回复(0)
行参,是规定传入参数的规格,二位数组作为行参是要确定一维数组的长度的
发表于 2018-08-14 22:46:51 回复(0)
int *s[8]是一个指针数组,数组中每个元素都是指针
int (*s)[8]是一个数组指针,指向一个数组,本质是指针!数组作为实参时,必须指定列数!
C选项是传递数组地址!D选项是直接传递数组(注意一定要指定列)!
发表于 2017-06-02 11:07:08 回复(0)
B答案应该是int* s[4]吧?
发表于 2016-07-28 12:52:06 回复(0)
void processArray(int(*arr)[8]) {
    // 处理数组
}

int main() {
    int D[4][8];
    processArray(D);
    return 0;
}
或者
void processArray(int *arr);
然后在调用函数时,将数组D的首地址作为实参传递给该函数:
processArray(&D[0][0]);


发表于 2023-09-12 17:36:14 回复(0)
这题实际上不严谨,将数组作为实参传给形参,问形参应该设计成什么?而并没有明确说明是传数组名D,还是传整个数组&D作为实参。
如果是传D,那么使用int D[][8]或者int (*s)[]。
如果是传&D,那么使用int (*s)[][8]
发表于 2022-11-28 23:09:42 回复(0)
int(*s)[8] 从语意上讲 等于“int[8]*  s ”,即声明指向含(一个或多个)有8个int元素的数组  的指针
发表于 2018-04-27 11:36:33 回复(1)
那如果B选项改成int *s[4]对不对啊
发表于 2017-09-21 16:54:02 回复(2)
用java的,看到这题一脸蒙蔽。。。
发表于 2017-08-17 19:11:59 回复(0)
数组传参指定列数。
发表于 2017-05-15 23:58:29 回复(0)