精华内容
下载资源
问答
  • 为什么函数声明和定义中的一维数组形参无须写明元素数目
    2017-12-08 20:50:17
    因为函数并不为数组参数分配内存空间。形参只是一个指针,它指向的是已经在其他地方分配好内存的空间,这个事实解释了为什么数组形参可以与任何长度的数组匹配——它实际传递的只是指向数组第一个元素的指针。
    更多相关内容
  • 作者:王姗姗,华清远见嵌入式学院讲师。  请看下面的程序:  #include  void func1(int arr[])  {  printf("%d\n",sizeof(arr));  arr=arr+1;  printf("%d\n",*arr);... int a[10]={1,2,3,
  • 一、一维数组形参退化、 二、二维数组形参退化、 三、数组形参等价关系、





    一、一维数组形参退化



    C 中将 一维数组 作为参数 , 传递到函数中 , 该 一维数组 会退化为 指针 ;

    int array[10]
    

    数组 , 作为参数 , 传递到函数中 ,

    void fun(int array[1000]){}
    

    void fun(int *array){}
    

    是等价的 , 函数中处理 array 数组时 , 不知道该数组的元素个数 , 编译器只能确认 , 该参数是一个 int * 指针类型 ;


    这样操作是为了提高 编译器 的效率 , 提高程序执行的效率 , 函数的 形参 最终要拷贝到 栈内存 中 ,

    • 如果将整个数组作为形参 , 需要拷贝整个数组的内容 , 如果数组有 1000 1000 1000 个元素 , 需要拷贝 4000 4000 4000 字节 , 这样效率就很低了 ;
    • 如果只需要拷贝数组地址 , 这个地址存放在指针变量中 , 只需要传递 4 4 4 字节就可以了 ;

    一维数组 形参 退化路径 :

    • int array[1000]
    void fun(int array[1000])
    {
    }
    
    • int array[]
    void fun(int array[])
    {
    }
    
    • int *array
    void fun(int *array)
    {
    }
    




    二、二维数组形参退化



    二维数组 作为 函数形参 , 也会退化为指针 ;


    二维数组 看作 一维数组 ,

    • 一维数组 中每个元素是 实际的数据 ,
    • 二维数组 中每个元素是 一维数组 ;

    一维数组 退化时 , 退化为 指向 一维数组元素指针 ;

    二维数组 退化时 , 退化为 指向 二维数组元素指针 , 这个 二维数组元素 就是 一维数组 , 也就是退化为 指向 一维数组的指针 ;

    特别注意 , 二维数组 退化的 指针 , 指向的 一维数组 是有效的 , 可以得到数组的元素个数 , 是一个正式的数组 ;


    二维数组 形参 退化路径 :

    • int array[10][20]
    void fun(int array[10][20])
    {
    }
    
    • int array[][20]
    void fun(int array[][20])
    {
    }
    
    • int (*array)[20] : 此处注意 , 数组指针 指向的 一维数组 是完整的数组 ;
    void fun(int (*array)[20])
    {
    }
    




    三、数组形参等价关系



    实参为 一维数组 int array[10] , 等效的 形参为 一级指针 int *array ;

    • 一维数组 , 直接退化为 指向 数组元素的指针 , 数组元素是 普通类型 , 指向普通类型的指针 , 即 一级指针 ;

    实参为 指针数组 int *array[10] , 等效的 形参为 一级指针 int **array ;

    • 指针数组 是 数组的元素 都是 指针变量 ;
    • 数组退化为 指针 , 指针指向的元素 也是 指针 , 则形参为 二级指针 ;

    实参为 二维数组 int array[10][20] , 等效的 形参为 一级指针 int (*array)[20] ;

    • 二维数组 的 数组的元素 是 一维数组 ;
    • 外围数组 ( 第二维 ) 退化为 指针 , 指针 指向的元素 是 一维数组 , 则形参为 指向 一维数组 的指针 , 每个一维数组有 20 20 20 个元素 ;
    展开全文
  • 主要给大家介绍了关于C语言中二维数组作为函数参数来传递的三种方法,文中通过示例代码介绍的非常详细,对大家学习或者使用C语言有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
  • 一维数组作为函数形参

    千次阅读 2018-04-25 14:53:53
    个例子引发的思考   运行以下代码,请问输出是什么?例子来源于《剑指Offer》,我对书上例子做了修改,让其可以运行。 #include using namespace std; int GetSize(int data[]) { return sizeof(data); ...

    转载:https://blog.csdn.net/oNever_say_love/article/details/49422517

    一、一个例子引发的思考

      运行以下代码,请问输出是什么?例子来源于《剑指Offer》,我对书上例子做了修改,让其可以运行。

    #include<iostream>
    using namespace std;
    
    int GetSize(int data[]) {
        return sizeof(data);
    }
    int main() {
        int data1[] = {1,2,3,4,5};
        int size1 = sizeof(data1);
    
        int *data2 = data1;
        int size2 = sizeof(data2);
    
        int size3 = GetSize(data1);
    
        cout<<size1<<" "<<size2<<" "<<size3<<endl;
        return 0;
    }
    
       
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    运行结果如下:
    这里写图片描述
      data1是一个数组,sizeof(data1)是求数组的大小。这个数组包含5个整数,每个整数占4个字节,因为总共是20个字节。data2声明为指针,尽管它指向了数组data1,对认真指针求sizeof,得到的结果都是4。在C/C++中,当数组作为函数的参数进行传递时,数组就自动退化为同类型的指针。因此尽管函数GetSize的参数data被声明为数组,但它会退化为指针,size3的结果仍然是4.

    二、数组的两个特殊性质

    (1)不允许拷贝和赋值

      不能将数组的内容拷贝给其他数组作为其初始值,也不能用数组为其他数组赋值。

    int a[] = {0,1,2};    // 含有三个整数的数组
    int s2 = a;           // 错误:不允许使用一个数组初始化另一个数组
    a2 = a;               // 错误:不能把一个数组直接赋值给另一个数组
       
    • 1
    • 2
    • 3

    (2)使用数组是通常将其转化成指针

      在C++语言中,指针和数组有非常紧密的联系。使用数组的时候编译器一般会把它转换成指针。

      通常情况下,使用取地址符来获取指向某个对象的指针,取地址符也可以用于任何对象。数组的元素也是对象,对数组使用下标运算符得到该数组指定位置的元素。因此像其他对象一样,对数组的元素使用取地址符就能的搭配指向该元素的指针:

    string nums[] = {"one", "two", "three"};  // 数组元素是string对象
    string *p = &nums[0];                     // p指向nums的第一个元素
       
    • 1
    • 2

      然而,数组还有一个特性:在很多用到数组名字的地方,编译器都会自动地将其替换为一个指向数组首元素的指针:

    string *p2 = nums;                        // 等价于p2 = &nums[0]
       
    • 1

      在大多数表达式中,使用数组类型的对象其实是使用一个指向该数组首元素的指针。

    三、数组形参

      数组的两个特殊性质对我们定义和使用作用在数组上的函数有影响。因为不能拷贝数组,所以我们无法以值传递的方式使用数组参数。因为数组会被转换成指针,所以当我们为函数传递一个数组时,实际上传递的是指向数组首元素的指针。
      尽管不能以值传递的方式传毒数组,但是我们可以把形参写成类似数组的形式:

    //尽管形式不同,但这三个print函数是等价的
    //每个函数都有一个const int*类型的形参
    void print(const int*);
    void print(const int[]);
    //这里的维度表示我们期望数组含有多少元素,实际不一定
    void print(const int[10]); 
       
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

      尽管表现形式不同,但上面的三个函数是等价的:每个函数的唯一形式都是const int*类型的。当编译器处理对print函数的调用时,只检查传入的参数是否是const int*类型:

    int i=0,j[2] = {0,1};
    print(&i);               //正确:&i的类型是int*
    print(j);                 //正确:j转船成int* 并指向j[0]
       
    • 1
    • 2
    • 3

      如果我们传给print函数的是一个数组,则实参自动地转换成指向数组首元素的指针,数组的大小对函数的调用没有影响。

      和其他使用数组的代码一样,以数组作为形参的函数也必须确保使用数组时不会越界。

                                                <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/production/markdown_views-ea0013b516.css">
                                    </div>
    
    展开全文
  • 形式参数是定义函数名和函数体的时候使用的,目的是用来接收调用该函数时传入的参数。 形式参数的作用 其作用是实现主调函数与被调函数之间的联系,通常将函数所处理的数据,影响函数功能的因素或者函数处理的结果...

    1.什么是形式参数

    “自定义函数中的“形参”全称为形式参数 由于它不是实际存在变量,所以又称虚拟变量。实参和形参可以重名。”

    2.形式参数的作用域

    函数的形式参数的作用域为本函数。
    形式参数是在定义函数名和函数体的时候使用的,目的是用来接收调用该函数时传入的参数。

    3.形式参数的作用

    其作用是实现主调函数与被调函数之间的联系,通常将函数所处理的数据,影响函数功能的因素或者函数处理的结果作为形参。
    形式参数不是实际存在变量,只有在程序执行过程中调用了函数,形式参数才有可能得到具体的值,并参与运算求得函数值。

    形式参数具体案例

    1.编程案例

    #include <stdio.h>
    
    int add (int x,int y)
    {
    	int set1;
    	set1=x+y;
    	return set1;
    }
    int main ()
    {
    	int data1=1;
    	int data2=2;
    	int set;	
    	set =add(data1,data2);
    	printf("set=%d\n",set);
    	return 0}
    

    运行结果:

    运行成功达到了我们的目的。
    那么我如果我们在main()函数中去打印set1的值可以吗?
    显然是不行的,在这里插入图片描述

    因为在函数调用结束时函数里的形式变量会自动释放。

    数组作形参

    1.一维数组作形参

    include <stdio.h>
    
    void PrintArray (int array[],int len ) // 形式参数中没有数组的概念即使定义了数组的大小也无效
    										//传递的是一个地址,是数组的首地址
    										
    {
    	int i;
    	for(i=0;i<len;i++){
    		printf("%d ",array[i]);
    	}
    	
    }
    int main ()
    {
    	int len ;
    	int array[]={1,2,3,4,5,6};
    	len=sizeof(array)/sizeof(array[0]);  //计算出元素个数
    //	PrintArray(array,len);
    	PrintArray(&array[0],len);
    	return 0;
    }
    

    运行结果:
    在这里插入图片描述

    2.二维数组做形参

    #include <stdio.h>
    
    void PrintArray (int array[][4],int hang,int lie ) //二维数组做形参不仅要注意数组类型还要注意有几个一维数组
    										
    {
    	int i;
    	int j;
    	for(i=0;i<lie;i++){
    		for(j=0;j<hang;j++){
    			printf("%d ",array[i][j]);
    		}
    		
    	}
    	
    }
    int main ()
    {
    	int array[3][4]={1,2,3,4,
    	5,6,7,8,
    	9,10,11,12
    	};
    	PrintArray(array,4,3);
    	return 0;
    }
    

    运行结果:
    在这里插入图片描述

    展开全文
  • 作者:王姗姗,华清远见嵌入式学院讲师。  请看下面的程序:  #include  void func1(int arr[])  {  printf("%d\n",sizeof(arr));  arr=arr+1;  printf("%d\n",*arr);... int a[10]={1,2,3,
  • 维数组作为形参

    2021-08-26 10:41:22
    首先需要理解编译器对于二维数组是如何寻址的: ...因此如果想要采用数组下标的形式作为形参,则必须给定n值(该即二维数组一行有多少列),否则无法定位出所寻址行的首地址,则无法进行正常的寻址。
  • 维数组作为函数形参该如何传递

    千次阅读 2020-05-10 17:49:33
    今天论坛上有朋友提问:声明函数如下void function(int** pInt),意图是想参数传递个二维数组。于是就定义了个二维数组,比如 int[1][1],然后调用函数。结果如何?当然是失败了,编译器提示:cannot ...
  • 做数据结构迷宫实验的时候,要生成个二维数组存储迷宫数据,为了保证程序的模块化,将生成部分单独放进函数migongsc()里。大致代码如下:  问题的关键就集中了如何将主函数中声明的二维数组migong...
  • C语言二维数组作为形参传递

    千次阅读 2019-01-22 10:48:38
    C语言中,把二维数组作为形参进行传递,有以下几种形式: case 1: void output_printf(int **a,int row,int col)  限制条件:形参二重指针,实参也要求二重指针,用于二维数组动态分配 case 2: void output_...
  • ,参数为二维数组函数声明方式 我就直接举例说明了 void addBase(Object (array[ROW][COLUMN]),int x,int y,Base::Direction); void addArea64(Object array[ROW][COLUMN], int x, int y, Object value) { ...
  • 函数就是定义类中的具有特定功能的段独立小程序。 •函数也称为方法。 函数的格式: •修饰符 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2,...) { 执行语句; return 返回值; } ...
  • 维数组作为函数形参函数声明

    千次阅读 2016-09-03 22:19:13
    如果我们需要编写个处理二维数组函数,那么这个函数原型应该如何声明呢? 首先,我们应该牢记:数组名被视为其地址,因此,相应的形参个指针。例如,假设有如下的代码: [cpp] ...
  • `param1`为二维数组在函数`void total_score_of_each_stu(param1, param2, param3,param4)`中该以怎样的形参形式去接收函数调用实参传递的参数?
  • 维数组形参写法

    万次阅读 2019-02-24 15:13:08
    传递二维数组 固定行列,直接传递地址 #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; void Print(int array[3][3]) { printf("\n"); for(int i=0;i&lt;3;i++...
  • C++中函数数组形参

    千次阅读 2018-09-08 22:13:18
    函数的操作数,也即形参(parameter),一对圆括号中声明形参形参之间以逗号分隔。 void swap(int a, int b) { int temp = a; a = b; b = temp; } 以上函数中,参数a和b就是swap()函数形参。当...
  • 1.二维多维数组除第一维长度可省略外,其他维不可省略 eg: void find(char a[3][10]); 对 void find (char a[ ][10]); 对 void find (char (*p)[10]); 对(用数组指针指向二维数组 [] 优先级高于*) void ...
  • 一个变量有地址,一个数组也有地址,不同的是数组...一维数组整型类(int) 通过指针变量指向一个一维 int 类型数组元素: int a[5]={0,1,2,3,4}; //定义一个数组名为 a 长度为5 的int类型变量 int *pa; //定义一...
  • 1. 二维数组常用创建方法 静态二维数组 ① 确定行和列 a. 不确定元素 int a[2][2]; b. 部分元素确定 int a[2][3] ={1,2,3,4}; c. 确定元素 int a1[2][2] = {{1,2,}{3,4}};//标准的二维数组初始化方式 //写明列号...
  • 通过指针变量指向一个一维数组(字符串 char类型) char a[20]={‘a’,’b’,’c’,’d’,’e’,’f’,’g’}; //定义一个数组名为 a 长度为20 的char类型变量 char a[20] = “abcdefg”; //定义一个数组名为 a 长度...
  • 因此,我们函数传递数组 的时候就可以用传递指针的方法。 有三种传递数组的方法 、三种传递数组的方法 1.通过指针传递数组 代码如下: // x指向数组的第个元素 void printValues(int *x,size_.
  • 维数组作为形参如何调用

    千次阅读 2018-11-17 16:38:22
    做Leetcode第36题:有效的数独中,遇到这样个问题:题目给出这样函数 bool isValidSudoku(char** board, int boardRowSize, int boardColSize),很显然三个形参分别是二维数组的数组名、行数和列数。...
  • 维数组作为函数形参

    千次阅读 2018-04-25 15:12:13
    转载:... 用二维数组名作为参数传递容易出现Segmention Error。这是因为不能正确为二维数组中元素寻址的问题,正确的方法如下:[cpp] view plaincopy #include <stdlib.

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 26,537
精华内容 10,614
关键字:

在声明函数的一维数组形参时