-
2017-12-08 20:50:17因为函数并不为数组参数分配内存空间。形参只是一个指针,它指向的是已经在其他地方分配好内存的空间,这个事实解释了为什么数组形参可以与任何长度的数组匹配——它实际传递的只是指向数组第一个元素的指针。更多相关内容
-
如何将一维数组作为函数形参来使用
2021-01-19 22:38:03作者:王姗姗,华清远见嵌入式学院讲师。 请看下面的程序: #include void func1(int arr[]) { printf("%d\n",sizeof(arr)); arr=arr+1; printf("%d\n",*arr);... int a[10]={1,2,3, -
【C 语言】数组 ( 一维数组形参退化 | 二维数组形参退化 | 函数形参等价关系 )
2021-11-30 17:15:43一、一维数组形参退化、 二、二维数组形参退化、 三、数组形参等价关系、
一、一维数组形参退化
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语言中二维数组作为函数参数来传递的三种方法
2020-08-25 16:20:03主要给大家介绍了关于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>
-
形式参数的解读,一维数组和二维数组作为形参
2021-11-20 12:26:42形式参数是在定义函数名和函数体的时候使用的,目的是用来接收调用该函数时传入的参数。 形式参数的作用 其作用是实现主调函数与被调函数之间的联系,通常将函数所处理的数据,影响函数功能的因素或者函数处理的结果...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; }
运行结果:
-
EDA/PLD中的如何将一维数组作为函数形参来使用
2020-11-07 10:02:12作者:王姗姗,华清远见嵌入式学院讲师。 请看下面的程序: #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 ... -
C++中二维数组作函数形参
2017-07-16 12:02:58在做数据结构迷宫实验的时候,要生成一个二维数组存储迷宫数据,为了保证程序的模块化,将生成部分单独放进一个函数migongsc()里。大致代码如下: 问题的关键就集中在了如何将主函数中声明的二维数组migong... -
C语言二维数组作为形参传递
2019-01-22 10:48:38C语言中,把二维数组作为形参进行传递,有以下几种形式: case 1: void output_printf(int **a,int row,int col) 限制条件:形参二重指针,实参也要求二重指针,用于二维数组动态分配 case 2: void output_... -
参数为二维数组的函数和指向二维数组的指针声明
2022-04-05 18:15:29第一,参数为二维数组的函数声明方式 我就直接举例说明了 void addBase(Object (array[ROW][COLUMN]),int x,int y,Base::Direction); void addArea64(Object array[ROW][COLUMN], int x, int y, Object value) { ... -
函数、内存、一维数组、二维数组
2018-06-27 22:40:22•函数就是定义在类中的具有特定功能的一段独立小程序。 •函数也称为方法。 函数的格式: •修饰符 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2,...) { 执行语句; return 返回值; } ... -
二维数组作为函数形参的函数声明
2016-09-03 22:19:13如果我们需要编写一个处理二维数组的函数,那么这个函数原型应该如何声明呢? 首先,我们应该牢记:数组名被视为其地址,因此,相应的形参是一个指针。例如,假设有如下的代码: [cpp] ... -
C/C++中二维数组作为形参传递参数
2021-11-27 19:42:08`param1`为二维数组,在函数`void total_score_of_each_stu(param1, param2, param3,param4)`中该以怎样的形参形式去接收函数调用时实参传递的参数? -
二维数组做形参写法
2019-02-24 15:13:08传递二维数组 固定行列,直接传递地址 #include <stdio.h> #include <stdlib.h> void Print(int array[3][3]) { printf("\n"); for(int i=0;i<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()函数的形参。当... -
二维数组作为形参的使用
2020-07-09 09:53:481.二维多维数组除第一维长度可省略外,其他维不可省略 eg: void find(char a[3][10]); 对 void find (char a[ ][10]); 对 void find (char (*p)[10]); 对(用数组指针指向二维数组 [] 优先级高于*) void ... -
C/C++指针与一维数组与函数形参(int类型)
2020-02-09 19:53:13一个变量有地址,一个数组也有地址,不同的是数组...一维数组整型类(int) 通过指针变量指向一个一维 int 类型数组元素: int a[5]={0,1,2,3,4}; //定义一个数组名为 a 长度为5 的int类型变量 int *pa; //定义一... -
C++ 二维数组创建&&二维数组作为函数返回值&&二维数组作为形参
2022-03-10 21:15:461. 二维数组常用创建方法 静态二维数组 ① 确定行和列 a. 不确定元素 int a[2][2]; b. 部分元素确定 int a[2][3] ={1,2,3,4}; c. 确定元素 int a1[2][2] = {{1,2,}{3,4}};//标准的二维数组初始化方式 //在写明列号... -
C/C++指针与一维数组与函数形参(char类,型相当于字符串)
2020-02-11 15:40:01通过指针变量指向一个一维数组(字符串 char类型) char a[20]={‘a’,’b’,’c’,’d’,’e’,’f’,’g’}; //定义一个数组名为 a 长度为20 的char类型变量 char a[20] = “abcdefg”; //定义一个数组名为 a 长度... -
函数参数传递——数组形参
2021-01-14 14:55:26因此,我们在向函数传递数组 的时候就可以用传递指针的方法。 有三种传递数组的方法 一、三种传递数组的方法 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.