本文目录一览:
- 1、C语言数组作为形参实参的一些疑惑?
- 2、C语言中数组名作为实参传给被调用的函数时,形参获得的是什么
- 3、C语言中,调用函数的实参是数组名,被调用函数的形参可不可以是指针
- 4、C语言中,数组名作为函数调用的实参时,下面叙述正确的是()。
- 5、C语言,二维数组调用时候形参和实参的问题
- 6、C语言关于一维数组做实参的问题
C语言数组作为形参实参的一些疑惑?
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了。传地址只需要复制地址给形参,相对传每个元素快得多。
C语言中数组名作为实参传给被调用的函数时,形参获得的是什么
C语言中数组名作为实参传给被调用的函数时,形参获得的是数组的起始地址。
还是用例子说话吧。
#includestdio.h
int *arry(int *a)
{
int *b;
b = a;
int i;
for(i=0;i5;i++)
{
printf("%d",a[i]);
} return b;
}
int main()
{
int a[5] = {1,2,3,4,5};
int *c;
int i;
c = arry(a);
for(i=0;i5;i++)
{
printf("%d",c[i]);
}
}
主要是通过指针把数组,例如main里面的a的地址传入arry函数,然后在arry函数中用一个兼容类型的指针接收地址,然后就可以再这个指针下的地址操作地址上面的数据了。
arry返回的时候也是返回一个指针(地址)。
C语言中,调用函数的实参是数组名,被调用函数的形参可不可以是指针
可以。是数组也行,如:
void f1(int a[])
{
}
void f2(int *p)
{
}
int a[]={1,2,3};
f1(a);
f2(a);
C语言中,数组名作为函数调用的实参时,下面叙述正确的是()。
正确的
B
例如:
f(int data[]);
f(int *data);
其实是等价的,都是一个指针传递。上面两种无论那种都可以传递一个数组名,作为实参。
实参传递给的数组名,就是数组的首地址。
因此通过数组名,传递其实就是把数组的首地址给了形参,因此通过地址就可以改变实参数组相应的值。
C语言,二维数组调用时候形参和实参的问题
int addnn(int a[][n])
数组的下标必须是常数,不能用变量
而且二维数组第二维的大小要和传递进来的数组一样大,因此应改为
int addnn(int a[][1024])
在我的计算机上定义a[1024][1024]数组过大,要改小一点
C语言关于一维数组做实参的问题
参数的两种形式:
1、传值:形参只是实参的一个副本,它只存在被调函数中,在被调函数中对形参的改变不会影响实参的值。
2、传址:形参是实参的一个地址,在被调函数中对形参的改变会影响实参的值。
在c语言中,简单变量默认是传值,而数组默认是传址。
所以出现你所说的一系列怪现象。
好好想一下,若还不明白请留言。