C语言数组作为形参实参的一些疑惑?

arr[]是一个值 ,而array数组首地址他们怎么能够进行值传递呢?

void fun(int arr[], int n);

在函数定义的时候,形参int arr[]不是表示某个元素的值,而是告诉编译器第一个参数是一个数组指针,可以接收实参传过来的数组地址。

实际上以上定义等价于下面的定义。

1.数组里面带元素个数:

void fun(int arr[常数], int n);

这里的常数可以是任意正整数,实际上编译器是会忽略,因为这里只要告诉编译器我接收的是一个数组指针,至于它有多少个元素不关心,因为实参也只是传个地址过来。元素个数由参数二控制。至于为什么要这么约定可以看下面补充说明。

2.void fun(int *arr, int n);

使用指针,这种方式和题目中的方式是最常用的方式,第一种最不常用。

补充说明(为什么数组作为函数参数是传地址,而不是传每个元素):

设想一下,有一个函数如下

int fun(int nums[1000], int size)

它的参数一要处理1000多个元素的数组,如果是传值即每个元素,那在函数体内是不是就得再申请1000多个整数的内存,还需要把值从实参那里复制过来,这是非常耗时间的而且没有必要,因为在内存的某个块已经存放了这些数据。只要告诉放在哪个位置,你函数体去那里找就行了。这里说的就是传地址了,只需要传个数组首地址,然后告诉有多少个元素要处理就OK了。传地址只需要复制地址给形参,相对传每个元素快得多。

温馨提示:内容为网友见解,仅供参考
第1个回答  2021-08-03
int arr[]等同于 int *arr,是指针类型,array是数组首地址,地址就是指针啊,当然可以赋值了。

C语言数组作为形参实参的一些疑惑?
1.数组里面带元素个数:void fun(int arr[常数], int n);这里的常数可以是任意正整数,实际上编译器是会忽略,因为这里只要告诉编译器我接收的是一个数组指针,至于它有多少个元素不关心,因为实参也只是传个地址过来。元素个数由参数二控制。至于为什么要这么约定可以看下面补充说明。2.void fun(int...

c语言中数组名为函数实参的问题?
代码在编译时会出现 error C2664: 'InsertSort' : cannot convert parameter 1 from 'int' to 'int []'这是因为用数组名做函数实参时,向形参(数组名或指针变量)传递的是数组首元素地址,因此对参数的类型做一下改变,如下图所示:

关于c语言数组的一些疑惑?
单个元素做形参,是建立一个变量副本,程序运行时,实参把值传给副本,就没有实参的什么事了,后面对副本的赋值、改写,都不会影响实参。而数组做形参时,只是把实参的首地址传给形参,后面对形参的元素的赋值和改写,直接对实参的数组元素进行了赋值和改写。在C语言中,array[10]有两种含义:①它指含...

c语言函数的形参与实参的问题?
首先要理解一点,数组在做参数传递的过程中会损失数组的长度信息,退化成一个指针 例如你形参写成(char s[10]),或者干脆(char s[]),函数只能接收到一个char 所以:char dp[n][m]的类型本质上是数组的指针,即char (*)[m],它是指向长度为m的char数组的指针 char **是char *的指针,指针是...

c语言关于实参形参表示的方式的问题
1,形参前面加了void是空函数 意思是不要求返回值么?那这题不是把声明部分全部返还了么?增加void表示不用返回值,即在函数中要使用return时,不用带值。比如返回值为int型,那么要用类似return 0;,而本例直接return;即可。void inv(int x[ ],int n)中x,n都是传入参数,x是数组,所以函数内...

c语言中形参和实参是什么意思?有什么区别?
如果实参是数组名了,那么它传送的就是地址的值了。比如:\\x0d\\x0adouble power(double x ,int n)定义一个双精度参数 \\x0d\\x0apower(3.0,5) 调用 \\x0d\\x0ax n 是形参,3.0,5是实参。如果上面定义的是整形 double power(int x ,int n),下面调用的是power(3.3,5)那么...

形参和实参的问题
形参引用是的指针,相当于直接引用指针所指地址中的数据,当在函数中 通过指针的引用而进行数据操作时就相当于对所指地址中的数据进行操作 即直接对实参进行操作 而一般的形参相当于在子函数中重新定义的变量,只不过变量的值与通过 实参传递过来的值一样,所以并不是对同一个变量进行操作,所作的操作...

c语言中形参和实参的区别?
有以下区别:1、主体不同:实参在调用有参函数时,函数名后面括号中的参数为“实际参数”。形参不是实际存在变量,又称虚拟变量。2、目的不同:实参可以是常量、变量或表达式,无论实参是何种类型的量,在进行函数调用时,都必须具有确定的值,以便把这些值传送给形参。需要注意当形参和实参不是指针类型...

C语言 一维数组 实参与形参与指针的问题
实参是a,它可以作为指针名使用,等同于指向首元a[0]的指针。形参int a[]等价于int *a,它指向实参a数组的首元a[0]的地址。

C语言试题,实参形参有点不懂...
)形参是 m,实参是 i k就是一个全局变量,既不是形参也不是实参 调用函数fun()的过程中形参的值m变为4,全局变量k的值也变为4。函数调用结束后形参m消失,全局变量k依然为4。同时函数调用结束之后 i 自加一次由4变成5。所以最后显示出来4 4 5 4 这里形参m的值并没有改变实参 i ...

相似回答