-
2020-12-06 21:10:39
在函数需要将数组作为参数传入时,数组是传址调用,即将数组作为实参时,传入的其实是数组的首地址,实质上是一个指针。
在定义函数时可以定义一个指针,然后去调用数组,此时在函数内部的操作会直接修改数组的实际对应元素。因为传输进函数的数组的本质就是数组的首元素地址,函数内部按照地址去修改当然相当于直接操作数组。
在需要一个函数返回数据时也可以用定义指针,然后传入数组,将需要传回的数据放进数组内,在函数结束调用后,去相应的数组内取回数据。
但是需要注意的是,数组传入函数时只有当传入的是一个数组名时才是传址调用,如果给定下标的话就是一个标量,例如定义一个数组int num[20]。当传入num[0]、num[1]或其他下标时,传入的就是一个标量,而非一个传址调用了,此时如果有需要依然传入地址,例如想将数据放入数组,但是想从第二个元素位开始,就需要加一个取址符 “&” ,即&num[2],此时会将num[2]的地址传入,在写入数据时,也会从num[2],开始。
注意:如果定义一个数组,元素只有一个下标,即类似于int num_ine[1],此时直接传入函数,也是标量传入,而非传址调用。
在需要将数组传入函数,但是不想数组被改变时,可以使用const 关键字修饰,即函数形参定义为int const num[],此时数组num会被声明为常量,即不可改变。
更多相关内容 -
C语言中数组作为函数的参数以及返回值的使用简单入门
2021-01-01 01:11:31函数通过数组作为参数 如果想通过一个一维数组作为函数的参数,就必须声明函数形式参数,使用以下三种方式与所有三个声明方法之一产生类似的结果,因为每一种方式告诉编译器,一个整数指针将会要被接收。类似的方式... -
C语言 数组做函数参数
2018-04-25 00:20:51这里如果真的把数组作为函数参数的话,需要分配临时的栈区执行拷贝等操作,所以编译器对代码进行了优化,把数组退化成了指针,因为指针做函数参数本身就是C语言的精华所在。这里的参数写成num[5],但是编译器在优化的...看下面代码:
int main() { int a[5]={3,6,4,2,5}; char *ptrChar="hello world";//ptrChar是char类型的指针,指向内存空间 int *ptrInt=a;//ptrInt是指向int类型的指针 printf("sizeof(char):%d\n",sizeof(char)); printf("sizeof(int):%d\n",sizeof(int)); printf("sizeof(ptrChar):%d\n",sizeof(ptrChar)); printf("sizeof(ptrInt):%d\n",sizeof(ptrInt)); printf("value of ptrChar is:%d\n",ptrChar); printf("value of (ptrChar+1) is:%d\n",ptrChar+1); printf("value of ptrInt is:%d\n",ptrInt); printf("value of (ptrInt+1) is:%d\n",ptrInt+1); system("pause"); return 1; }
程序运行结果如下:
从程序的运行结果可以得出:
指针本身是一个变量,它所存储的是另一个变量的地址,指针变量所占的内存是4个字节,这与它所指向的变量所占的内存空间大小是没有关系的,指针变量本身和它所指向的内存空间是完全独立的。
在源代码级别上对指针变量+1,编译器内部增加的值是该指针所指向的变量的宽度,这种优化避免了指针指向一个不完整的地址。
下面的代码:
void arraySort(int num[5],int lenth) { int i,j,temp; int tmpLenth=sizeof(num)/sizeof(num[0]); printf("tmpLenth:%d\n",tmpLenth); for(i=0;i<lenth;i++) { for(j=i+1;j<lenth;j++) { if(num[i]>num[j]) { temp=num[i]; num[i]=num[j]; num[j]=temp; } } } } void displayArray(int num[5],int lenth) { int i; for(i=0;i<lenth;i++) { printf("%d\t",num[i]); } printf("\n"); } int main() { int a[5]={3,6,4,2,5}; int lenth=sizeof(a)/sizeof(a[0]);//a是数组名,也是数组的首地址,sizeof(a)是整个数组所占的内存空间的大小 printf("lenth:%d\n",lenth); printf("origin:"); displayArray(a,lenth); arraySort(a,lenth); printf("final:"); displayArray(a,lenth); system("pause"); return 1; }
运行结果:
这里,数组做函数参数,运行结果发现函数内sizeof(num)/sizeof(num[0])的结果是1,就是说传过来的参数根本不是数组。这里如果真的把数组作为函数参数的话,需要分配临时的栈区执行拷贝等操作,所以编译器对代码进行了优化,把数组退化成了指针,因为指针做函数参数本身就是C语言的精华所在。这里的参数写成num[5],但是编译器在优化的时候会直接忽略中括弧里的数,常见的写法是不写括弧里的数:num[],或者直接写成指针*pNum。
-
C语言中二维数组作为函数参数来传递的三种方法
2020-12-25 23:03:16c语言中经常需要通过函数传递二维数组,有三种方法可以实现,如下: 方法一, 形参给出第二维的长度。 例如: #include void func(int n, char str[ ][5] ) { int i; for(i = 0; i < n; i++) printf("/nstr... -
shell 使用数组作为函数参数的方法(详解)
2020-09-15 10:18:53下面小编就为大家带来一篇shell 使用数组作为函数参数的方法(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 -
数组作为函数参数
2021-11-09 19:32:42数组作为函数参数 前面我们学过,变量可以当作参数是吧!这里数组也是可以当做函数的参数滴,啊?什么?你问数组咋当参数?请看下面知识。 数组可以由整个数组当作函数的参数,也可以由数组中的某个元素当作函数的...数组作为函数参数
前面我们学过,变量可以当作参数是吧!这里数组也是可以当做函数的参数滴,啊?什么?你问数组咋当参数?请看下面知识。
数组可以由整个数组当作函数的参数,也可以由数组中的某个元素当作函数的参数:
1、整个数组当作函数参数,即把数组名称传入函数中,例如:
2、数组中的元素当作函数参数,即把数组中的参数传入函数中,例如:
数组作为函数参数时注意以下事项:
1、数组名作为函数实参传递时,函数定义处作为接收参数的数组类型形参既可以指定长度也可以不指定长度。
2、数组元素作为函数实参传递时,数组元素类型必须与形参数据类型一致。
————————————————————————————————
任务
替换指定数组中的最大元素。要求指定整数为数组arr2中的第一个元素arr2[0]。
在代码编辑器中:
第22行填写相应代码
运行结果为
-
go语言 数组做函数参数和数组指针做函数参数
2018-12-15 11:38:41一、数组做函数参数 数组做函数参数:在传递过程中,传递的是实参中每个元素的拷贝,如果实参数组较大,效率比较低 package main import "fmt" //数组作为函数的参数,是进行值传递 //实参数组的每...一、数组做函数参数
- 数组做函数参数:在传递过程中,传递的是实参中每个元素的拷贝,如果实参数组较大,效率比较低
package main import "fmt" //数组作为函数的参数,是进行值传递 //实参数组的每一个元素,在传递的时候,都给形参拷贝一份,因此当实参数组较大,效率就比较低 //简而言之:形参数组是实参数组的复制品 func transferAndModify(arr [5]int) { arr[0] = 111 fmt.Println("modify:arr=", arr) //modify:arr= [111 5 3 9 10] } func main() { // 定义一个数组 arr := [5]int{1, 5, 3, 9, 10} // 定义一个函数 transferAndModify(arr) // 值传递 fmt.Println("main:arr=", arr) //main:arr= [1 5 3 9 10] }
二、数组指针做函数的参数
- 数组的指针做函数的参数:传递实参的内存地址,指向实参的内存
package main import "fmt" //p指向实参数组arr,p就是数组arr的指针 //*p代表指针所指向的内存,就是实参arr func transferAndModify(p *[5]int) { (*p)[0] = 111 fmt.Println("transferAndModify:*p=", *p) //transferAndModify:*p= [111 5 3 9 10] } func main() { // 定义一个数组 arr := [5]int{1, 5, 3, 9, 10} // 定义一个函数 transferAndModify(&arr) //地址传递 fmt.Println("main:arr=", arr) //main:arr= [111 5 3 9 10] }
-
最新单片机仿真 用数组作函数参数控制流水花样
2022-05-21 08:27:54最新单片机仿真 用数组作函数参数控制流水花样最新单片机仿真 用数组作函数参数控制流水花样最新单片机仿真 用数组作函数参数控制流水花样最新单片机仿真 用数组作函数参数控制流水花样最新单片机仿真 用数组作函数... -
易懂的数组作为函数参数(C语言)
2020-05-17 10:50:55目录易懂的数组作为函数参数(C语言)1、数组做函数参数2、通过形参数组修改数组元素3、数组排序 1、数组做函数参数 (1)、若将一个数组作为实际参数传递给函数,只需不带方括号的数组名即可 若数组a的定义为:int ... -
golang-数组做函数参数
2019-09-08 13:38:552)数组作为函数参数,收到的是数组的一个拷贝,而不是它的指针 3)数组的大小是类型的一部分,[10]int和[20]int是不一样的 这里重点探索一下 2) 首先看一下C++的代码: #include <iostream> #include<map... -
C语言/C++ 数组作为函数参数
2021-05-19 08:14:22前几天帮别人解决数组拼接问题(类似字符串拼接)时想到这个专题。因为她的代码太糟糕。我们知道C、C++中的数组是没有拷贝(复制)运算的,除非编译器支持。因为C语言发明的初衷是替换汇编语言,要知道你用不同指令集的... -
C语言:多维数组做函数参数
2017-09-17 10:49:45(1)用多维数组名做函数参数: #include int max_value(int array[][4]); int main( ) { int b[3][4]={{1,2,3,4},{5,6,7,8},{9,13,14,23}}; printf("max value is %d\n",max_value(b)); return 0; } int m -
C语言中值得深入知识点----数组做函数参数、数组名a与&a区别、数组名a的"数据类型
2016-07-12 21:29:23本文用简单的例子说明了C语言中数组做函数参数,数组名a与&a区别,数组名a的"数据类型",以及编译器的不同,相应指针所占字节的不同导致程序的细微差别。 -
C语言数组、结构体、结构体数组作为函数参数
2021-03-27 16:05:32数组作为函数参数 如果想把一个数组名参数传递给函数,正确的函数形参应该是怎样的?它是应该声明为一个指针还是一个数组? 调用函数时实际传递的是一个指针,所以函数的形参实际上是一个指针,但为了使程序员新手更... -
C/C++中二维数组作为函数参数------方法及要点讲解
2020-06-28 09:12:43C/C++中二维数组作为函数参数 的时候,可以不写行号,但是一定要写明列号(一定注意,一定注意,一定注意!)。 int array[3][3]; 函数声明:void fuc(int a[][3]); 函数调用:fuc(array); ——在函数fuc中,a是二维... -
C语言数组作为函数参数
2019-02-24 20:24:59一:数组元素作为函数的实参 数组元素就是变量,与普通变量没有区别,将数组元素传送给形参,实现单向的值传递。 #include <stdio.h> float max(float x,float y){ if(x > y) return x; ... -
C语言 二维数组作为函数参数的4种方式
2020-08-10 20:59:06然而,在将二维数组作为函数参数传递时,参数结构较复杂,难以理解。本文章是实用型文章,注重代码使用,不会讲述过多理论。如果想要学习理论知识(非常推荐,可以对代码的理解更透彻),可以查阅下方参考文献列出... -
C++中如何将数组作为函数参数
2019-07-21 21:03:431.一维数组做函数参数 void func(int array[]) 声明形参数组并不意味着真正建立一个包含若干元素的数组,在调用函数时也不对它分配存储单元,只是用array[ ]这样的形式表示array是一维数组的名字,用来接收实参传... -
C:字符串数组作为函数参数
2019-12-16 21:52:11#include <stdio.h> /* void PrintStr(char s[][50], int n) { int i = 0; for ( i = 0; i < n; i ++ ) { puts(s[i]); } } */ int main() { /* char arr[][50] = { ... -
golang用数组作为函数参数
2020-10-11 20:24:55作为参数传进函数时,传递的是数组的原始值拷贝,此时在函数内部是无法更新该数组的 package main import "fmt" func main() { x := [3]int{5,2,9} func(arr [3]int) { arr[0] = 8 fmt.Println(arr) }... -
二维数组传参(二维数组作为函数参数)
2021-11-23 20:13:52传递参数是二维数组 二维数组传参,函数形参的设计只能省略第一个[ ]的数字; 因为对于二维数组,可以不知道有多少行,但必须知道一行多少个元素; #include<iostream> using namespace std; void test(int... -
C++中数组作为函数参数的注意问题
2020-07-14 16:20:43C++中数组作为函数参数的注意问题 1 问题引入 从《剑指Offer》上的相关问题,下面的输出是什么? #include<iostream> using namespace std; int GetSize(int data[]) { return sizeof(data); } int main() {... -
C++中使用结构体数组作为函数参数
2020-06-25 09:51:01在写C++的时候,当使用一个数组作为函数参数传入的时候,数组自动转化成指针变量。 int arr[] = {1,2,3}; //arr++; //这里错误 void printArr(arr[]) { arr++; //正确 } 因此在函数内部修改形参数组时,实参也会... -
C语言:多维数组作为函数参数
2019-01-22 23:42:13在,C语言中,多维数组也可以作为函数参数,传递的也是数组的首地址。与一维数组类似,数组名作为实际参数,而被调用函数中的形式参数在定义时可以指定每一维的长度,也可以省略第一维的长度。 例如,二维数组,在... -
数组作为函数的参数
2018-09-05 10:00:10本文内容摘自《C和指针》 传值与传址 ...如果被传递的参数是一个数组名,由于数组名的值是一个指向数组第一个元素的指针,因此实际传递给函数的是指向数组起始位置的指针的一份拷贝,该指针同样指向数组... -
C语言数组作为函数的参数
2020-06-20 17:50:16C语言的数组是一系列数据的集合,无法通过参数将它们一次性传递到函数内部,如果数组作为函数的参数,必须传递数组指针。 void func(int *p, int n) //对数组进行冒泡排序 { int temp; for(i = 0; i < n-1;... -
指针数组作为函数参数的传递
2020-03-14 20:34:54想了解指针数组作为函数参数传递,就必须清楚指针数组的概念,指针数组是一个一维数组,存放的是(int、char、short、long、double、float)+*的内容,也即数组中的每个元素存放的是一个地址。 了解了指针数组的本质... -
结构体数组作为函数参数
2018-09-21 08:29:27把结构体数组名作为函数的一个参数,然后在这个函数的函数里面继续作为参数,把一个值赋给这个结构体数组的一个变量,我再赋值的地方是有值的,在函数里面也是有值的,但是出了这个函数回到主函数时,这个结构体数组...