C++随记(六)---函数处理数组的一些问题

C++随机(六)---函数处理数组的一些问题

本篇讨论数组做函数形参的情况。

通常,我们按照以往设置形参的习惯,可能会对数组形参做如下的书写:

int example( int arr[ ], int n); //arr是一个数组名,n是这个数组的大小

但仔细想一下,arr作为数组名应该是一个指针才对,而实际上,更标准的函数头应该是这样的:

int example(int *arr, int n);

其中用 int *arr 替代了 int arr[ ],

这两个函数头其实都是正确的,在C++中,当且仅当 用于函数头或者函数原型中, int arr[ ]和int *arr 的含义是相同的,都意味着arr是一个int类型的指针。

只不过,用 int arr[ ]其实能够提醒我们,在这里arr不但是一个指针,而且是指向一个 int数组的首元素的指针,说白了就是告诉我们,这里应该是一个数组而不是普通的指针形参。所以在实际编程中,使用数组表示法其实更容易理解程序。

数组作为形参发生了什么?

实际上,数组作为形参的时候,函数并没有把数组的内容传递过来,而是通过另一种方式来对这个数组进行操作,(int arr[ ], int n)将数组的位置(首元素的地址)、数组的类型(此处是int)、数组的大小(即元素个数n)这三个关键信息传递过来了,这样实际有点类似与按指针传递,所以常规变量的形参,实际是对改变量的一个拷贝(值传递),而数组作为形参时,是对原来的数组进行操作(指针传递)。

熟悉C++值传递和指针传递的朋友应该马上就明白这个意思了。这个问题在二级或者期末考试中已经被考烂了。

将数组名与指针对应的好处在于:如果我每次都是要像常规变量一样做一个数组的拷贝,内存的开销就比较大了,函数并不是每次都对数组的所有元素进行操作啊,而指针传递的话,相当于是对原数组进行操作,并没有开辟新的内存。

注意:为将数组类型和元素数量告诉数组处理函数,务必通过两个不同的参数来传递它们:

int exam( int arr[ ], int n);//  right!
int exam(int arr[n]);//  wrong!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏noteless

[一]基础类型概述

https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

683
来自专栏飞雪无情的博客

Go语言实战笔记(四)| Go 数组

数组,是用来存储集合数据的,这种场景非常多,我们编码的过程中,都少不了要读取或者存储数据。当然除了数组之外,我们还有切片、Map映射等数据结构可以帮我们存储数据...

773
来自专栏小灰灰

JDK容器学习之Queue: ArrayDeque

数组双端队列 ArrayDeque 双端队列,表示可以添加元素到(或删除,获取)队列头也可以添加元素到(或删除,获取)队列尾 ? 1. 底层数据结构 类中定义成...

1726
来自专栏全沾开发(huā)

搞懂JavaScript中的连续赋值

搞懂JavaScript中的连续赋值 前段时间老是被一道题刷屏,一个关于连续赋值的坑。 遂留下一个笔记,以后再碰到有人问这个题,直接...

3446
来自专栏程序员互动联盟

【专业知识】初学者需要知道的10个Java字符串问题

下面我为大家总结了10条Java开发者经常会提的关于Java字符串的问题,如果你也是Java初学者,仔细看看吧: ? 1、如何比较字符串,应该用”==”还是eq...

3547
来自专栏Java帮帮-微信公众号-技术文章全总结

04-02.总结switch,for,while,do。while跳转语句

(4)do...while循环 A:基本格式 do { 循环体语句; }while(判断条件语句); 扩展格式: 初始化语句; do { 循环体语...

3574
来自专栏王翔的专栏

ES6基础 数组的扩展

对于那些没有部署 Iterator 接口的类似数组的对象(如普通object),扩展运算符就无法将其转为真正的数组。

352
来自专栏软件开发 -- 分享 互助 成长

多维数组的理解

要清楚的理解多维数组,需要先理解指针的算术运算和数组名的含义。 1、指针的算术运算     指针的算术运算与普通的类型的算术运算是不同的,编译器会在指针的算术运...

20110
来自专栏技术专栏

python3入门与实践(六):函数式编程

一定程度下lambda可以替换命令式编程的函数,reduce可以替换命令式编程的循环

731
来自专栏Laoqi's Linux运维专列

python3–函数

37611

扫码关注云+社区