首页 > 试题广场 >

以数组名作函数参数时,实参数组与形参数组都不必定义长度,因此

[单选题]
以数组名作函数参数时,实参数组与形参数组都不必定义长度,因此实参与形参的结合方式是地址结合,与数组长度无关。请问这句话的说法是正确的吗?
  • 正确
  • 错误
对于一维数组,这句话是对的。
作为实参:
一维数组的定义不需要定义长度,系统有时候可以自己判断长度,比如:int a[] = {1,2};
作为形参:
在函数的形参定义时,有没有长度无所谓,参数传递是以指针形式实现的;比如void fun(int a[]){}

二维数组则不同:
作为实参:
二维数组定义的时候,一定要给定第二维(列)的长度!
作为形参:
假如定义了int a[2][3],这里的a不是二级指针int **p,而是表示数组指针,
也就是说a是指向大小为3的一维数组的指针,(a+1)则是下一个大小为3的一维数组的指针……
形参中,可以表示数组指针的形式只有void fun( p[2][3] ){}形式!(2可以省略)
(请教一下怎么在这里改变字体颜色?总不能每次都在word里面改好再复制过来吧?)

举个例子:
假如你定义了二维数组int a[2][3] = {...},想要调用fun(a),你传递就是数组指针,
你的定义可能如下:
A. void fun( int **p ) {}
fun(a)a下面标记错误:int(*)[3]类型的实参和int **类型的形参不符

B. void fun( int *p[ ] ) {}

报错和A完全相同:形参会把[]退化成指针,这相当于定义了形参为二级指针;

C. void fun( int *p[3] ){}
报错如上:形参不会识别[ ]中的3;
D. void fun( int p[ ][ ] ) {}
p[ ][ ]定义错误,什么时候都不能出现p[ ][ ],因为第二维不能为空;
E. void fun( int p[2][3] ){}
正确,这是我知道的,唯一的,符合“实参是数组指针”的形参的定义形式;2可有可无。

综上:
二维数组名a其实是(一维数组)指针,而不是二级指针!
假如自己编代码用到数组是实参,可以定义形参和实参完全一样,可以省去不少麻烦而且不会出错。
发表于 2018-06-29 10:13:17 回复(3)
二维数组声明为形参的时候,必须要保留第二维的大小,当使用指针的时候,需要用数组指针
发表于 2017-12-21 10:17:58 回复(1)
一维数组是可以这样做的,但是超过一维之后后面的维度必须要显式声明
发表于 2018-07-25 10:18:15 回复(0)
一维数组正确,但高维数组仅能隐藏最高维,第二第三后续维度需要显式提供。
发表于 2022-03-12 15:30:11 回复(1)
我有不一样的看法,在c++中,当数组名作为函数参数传递时,实参数组与形参数组都不需要定义长度。这是因为数组名本身就是指向数组首元素的指针,它存储了数组的地址。在函数调用时,数组名作为实参传递给函数时,实际上传递的是数组的地址。 形参数组是函数定义中用于接收实参的参数组,它们的类型应与实参对应。因为实参传递的是数组地址,所以形参应该声明为指针类型,例如int* arr。 由于传递的是数组地址,实参与形参的结合方式是地址结合。这意味着在函数内部,通过形参(即指针)可以访问到实参所表示的数组元素,通过操作指针和偏移量,可以对数组元素进行访问和修改,而与数组的长度无关,在使用数组作为函数参数时,一般也需要同时传递数组的长度信息 说明:对于数组类型的参数传递,无论是一维数组还是多维数组,数组名实际上会被转化为指针类型,这是因为在函数参数的传递过程中,数组名会自动退化为指向数组首元素的指针。 证明:1.当函数接收一个数组作为参数时,通常使用指针类型来声明形参,例如int* arr或int arr[ ]。这意味着形参实际上是一个指向数组首元素的指针。在函数调用时,实参传递给形参时,会讲数组名转换为指向数组首元素的指针,并将该指针的地址传递给形参。这就是地址结合的过程 2.在函数内部,可以通过指针+偏移量的方式访问数组元素。无论数组的大小如何,访问数组元素的方式是通过指针加上偏移量来进行的,而与数组的长度无关。 在c++中,二维数组实际上是由一维数组组成的数组。当以二维数组名作为函数参数传递时,传递的是指向二维数组首元素(即一维数组)的指针,对于二维数组,形参可以声明为指向数组元素的指针,例如int (*arr)[N], 或int **arr。 以上仅讨论实参与形参的结合方式!
发表于 2023-09-13 14:26:35 回复(1)
如果是指针的话,实参必须定义长度
发表于 2022-06-03 21:59:10 回复(1)

当使用指针的时候,需要用数组指针

// testcpp.cpp : Defines the entry point for the console application.
//

#include "iostream"
using namespace std;
int a[3][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
void A1(int a[][3])
{
    a[0][0] = -1;
}
void A2(int(* a)[3])
{
    a[0][0] = -2;
}
int main()
{
    A1(a);
    cout << a[0][0] << endl; // -1

    int (*p)[3] = a;
    A2(p);
    cout << a[0][0] << endl; // -2

    cout<<(*p)<<endl;        // 0x4a2020
    cout<<(*p)[0]<<endl;     //    -2
    cout<<*(p+1)<<endl;         // 0x4a202c
    cout<<*(p+1)[0]<<endl;     // 4
    cout<<*(*(p+1)+2)<<endl; // 6
    return 0;
}
发表于 2018-04-27 09:11:07 回复(0)
实参 必须定义长度。如果是指针的话 ,定义时也需要分配动态内存。 
发表于 2017-09-03 15:29:22 回复(0)
二维数组必须要声明第二维的长度,同时形参必须是数组指针
发表于 2019-12-19 16:28:11 回复(0)
实参是数组时,不可能是不知道长度的,都有长度
发表于 2017-09-14 15:33:07 回复(0)
求解析......
发表于 2017-08-27 10:20:16 回复(2)
三维数组保留后两维的大小
发表于 2023-05-01 19:21:22 回复(0)
一维数组可以,二维不行
发表于 2022-11-10 15:28:20 回复(0)
还得考虑二维数组,仅对一维数组正确
发表于 2022-11-06 18:04:16 回复(0)
实参传递到形参时,实参 必须定义长度。如果是指针的话 ,定义时也需要分配动态内存。
发表于 2022-03-06 14:31:36 回复(0)
坑。没有考虑二维数组的情况
发表于 2021-12-05 14:55:10 回复(0)
二维数组,必须列大小定义!!!
发表于 2021-04-07 17:15:42 回复(0)
二维数组声明为形参的时候,必须要保留第二维的大小
发表于 2020-05-24 20:47:57 回复(0)
二维及以上数组,必须显式声明一维之后的维度,或者使用数组指针
发表于 2018-09-14 20:59:41 回复(0)
实参与行参的结合方式有两种,址传递和值传递
发表于 2017-09-08 22:22:34 回复(0)