C/C++中传递数组参数的问题

将数组作为参数进行传递

 

有两种传递方法,一种是function(int a[]); 另一种是function(int *a)

这两种两种方法在函数中对数组参数的修改都会影响到实参本身的值!

对于第一种,根据之前所学,形参是实参的一份拷贝,是局部变量。但是数组是个例外,因为数组的数据太多了,将其一一赋值既麻烦又浪费空间,所以数组作为参数传递给函数的只是数组首元素的地址,数据还是在内存里的,函数在需要用到后面元素时再按照这个地址和数组下标去内存查找。也就是说后面的元素根本没到函数里来。所以,这里也不能在test()函数内部用sizeof求数组的大小,必须在外面算好了再传进来

对于第二种,则是传址调用,无需再说。

这里还有几点需要注意:

1.在以上两个函数的形参前面加上const则表示整个数组只读,而不是只有首地址对应存储的数据只读。

2.第二种形式不能用C++11中的for...auto来循环打印。

3.数组的大小要用sizeof()来求,不能用.size(),因为.size()只有struct 或者union才能用, vector算是struct!

4.如果在函数内部又声明一个int* tmp类型的变量,然后把p赋值给tmp, 通过tmp修改数数组也是一样,都会修改实参本身!

 

测试代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <stdio.h>
#include <algorithm>
using  namespace  std;
 
void  test1( int [],  int  size);
void  test2( int  *p,  int  size);
//void test2(const int *p, int size);
 
int  main( void )
{
     int  a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
     int  size =  sizeof (a)/ sizeof ( int );
     /*这里打印出的a值与test1(),test2()中的p值相等
      *即地址值相同*/
     printf ( "%p \n" , a);
     //test1(a, size);
     test2(a, size);
     int  i;
     printf ( "main: " );
     for (i = 0; i < size; ++i)
     {
         printf ( "%d " , a[i]);
     }
}
 
void  test1( int  p[],  int  size)
{
     printf ( "%p \n" , p);
     p[4] = 111;
     printf ( "test1: " );
     int  i;
     for (i = 0; i < size; ++i)
     {
         printf ( "%d " , p[i]);
     }
     printf ( "\n" );
}
 
void  test2( int  *p,  int  size)
{
     printf ( "%p \n" , p);
     *(p+4) = 222;
     printf ( "test2: " );
     int  i;
     for (i = 0; i < size; ++i)
     {
         printf ( "%d " , *(p+i));
     }
     printf ( "\n" );
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SunnyFish-ty

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值