转载:https://blog.csdn.net/qq_33374294/article/details/90769668

原链接:https://www.cnblogs.com/abella/p/10607061.html

有两种传递方法,一种是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");

}

C++中数组作为形参的方法的更多相关文章

  1. 总结Javascript中数组各种去重的方法

    相信大家都知道网上关于Javascript中数组去重的方法很多,这篇文章给大家总结Javascript中数组各种去重的方法,相信本文对大家学习和使用Javascript具有一定的参考借鉴价值,有需要的 ...

  2. 将java中数组转换为ArrayList的方法实例(包括ArrayList转数组)

    方法一:使用Arrays.asList()方法   1 2 String[] asset = {"equity", "stocks", "gold&q ...

  3. java中数组有没有length()方法?string没有lenght()方法?

    java中数组有没有length()方法,求数组的长度可以使用数组的length属性. int[] arr={1,2,3,4,5}; int length=arr.length;//求数组的长度 -- ...

  4. javascript中数组的22种方法

    × 目录 [1]对象继承 [2]数组转换 [3]栈和队列[4]数组排序[5]数组拼接[6]创建数组[7]数组删改[8]数组位置[9]数组归并[10]数组迭代[11]总结 前面的话 数组总共有22种方法 ...

  5. javascript中数组和字符串的方法比较

    × 目录 [1]可索引 [2]转换 [3]拼接[4]创建[5]位置 前面的话 字符串和数组有很多的相同之处,它们的方法众多,且相似度很高:但它们又有不同之处,字符串是不可变值,于是可以把其看作只读的数 ...

  6. javascript中数组的深拷贝的方法

    一.什么是浅拷贝 在js当中,我们常常遇到数组复制的的情况,许多人一般都会使用"="来直接把一个数组赋值给一个变量,如 var a=[1,2,3]; var b=a; consol ...

  7. 【Java面试题】18 java中数组有没有length()方法?string没有lenght()方法?下面这条语句一共创建了多少个对象:String s="a"+"b"+"c"+"d";

    数组没有length()这个方法,有length的属性.String有有length()这个方法. int a[]; a.length;//返回a的长度 String s; s.length();// ...

  8. javascript中数组的22种方法 (转载)

    前面的话 数组总共有22种方法,本文将其分为对象继承方法.数组转换方法.栈和队列方法.数组排序方法.数组拼接方法.创建子数组方法.数组删改方法.数组位置方法.数组归并方法和数组迭代方法共10类来进行详 ...

  9. JavaScript中数组Array.sort()排序方法详解

    JavaScript中数组的sort()方法主要用于对数组的元素进行排序.其中,sort()方法有一个可选参数.但是,此参数必须是函数. 数组在调用sort()方法时,如果没有传参将按字母顺序(字符编 ...

随机推荐

  1. Spine学习二 -播放Spine动画

    要想播放一个Spine动画,必须要在一个物体上绑定一个Spine播放的组件,这里暂时使用SkeletonAnimation组件. 然后就是编写动画的控制脚本. 这里提一个特性: [SpineAnima ...

  2. 如何利用 docker 快速部署 Mysql 服务

    docker 基础教程不再多说,这里只着重讲如何使用 docker 部署 mysql 服务 docker 拉取 访问 dockerhub,搜索关键词 mysql,我这里选择 mysql-server, ...

  3. Zabbix template for Microsoft SQL Server总结

      Zabbix template for Microsoft SQL Server介绍   这里介绍Zabbix下监控Microsoft SQL Server数据库非常好用的一个模板,模板名为&qu ...

  4. SEDA架构实现

    一.SEDA SEDA全称是:stage event driver architecture,中文直译为“分阶段的事件驱动架构”,它旨在结合事件驱动和多线程模式两者的优点,从而做到易扩展,解耦合,高并 ...

  5. 2020云栖大会智慧出行专场:聚焦高精地图/算法、智能模型、自动驾驶、AR导航

    2020云栖大会将于9月17日-18日在线举行,届时将通过官网为全球科技人带来前沿科技.技术产品.产业应用等领域的系列重要分享.   阿里巴巴高德地图携手合作伙伴精心筹备了“智慧出行”专场.我们将为大 ...

  6. VMware安装Centos7并联网使用

    一.安装VMware VMwareworkstation官方下载地址: https://www.vmware.com/cn/products/workstation-pro/workstation-p ...

  7. linux下设置账户锁定阈值:登录失败n次,多长时间后解锁重新登录

    在centos系统下: 1.执行命令 vim /etc/pam.d/system-auth或vim /etc/pam.d/ login 2.执行命令 vim /etc/pam.d/sshd 3.在上面 ...

  8. Spring Batch远程分区的本地Jar包模式

    1 前言 欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章! Spring相关文章:Springboot-Cloud Spring Batch远程分区对于大量数据的处理非常擅长,它的实现 ...

  9. git注册到git管理远程仓库

    注册: ① 注册github网站:地址:https://github.com/,其中sign up 是注册,sign in是登录 (如果是用QQ邮箱的话,如果觉得收不到邮箱,可能是在垃圾箱哦) ② 之 ...

  10. RXJAVA之Subject

    RxJava中常见的Subject有4种,分别是 AsyncSubject. BehaviorSubject.PublishSubject. ReplaySubject. AsyncSubject 使 ...