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 条评论
登录 后参与评论

相关文章

来自专栏Python攻城狮

Python高级编程-装饰器1.装饰器的理解 2.多个装饰器 3.装饰器(decorator)功能 4.装饰器示例

装饰器是程序开发中经常会用到的一个功能,用好了装饰器,开发效率如虎添翼,所以这也是Python面试中必问的问题,但对于好多初次接触这个知识的人来讲,这个功能有点...

662
来自专栏WindCoder

《简明 Python 教程》学习笔记-函数

回来后,重心一直放在地方站那边了,这边只是偶尔回来看看同时回复一下大家的留言,这两天可以放松一下心神,让自己静静,考虑码码字的问题,python在假期过后就没看...

401
来自专栏IT派

Java面试中常被问到的几大技术难题

大家在平常面试java的过程中都会遇到哪些难题呢?还有一些即将去面试java的童鞋们,你们想知道技术面试中会涉及到哪些点吗?达妹为你整理Java面试中会被问到的...

1020
来自专栏一“技”之长

Swift讲解专题七——函数 原

        函数是有特定功能的代码段,函数会有一个特定的名称调用时来使用。Swift提供了十分灵活的方式来创建与调用函数。事实上在Swift,每个函数都是一...

653
来自专栏liulun

Nim教程【七】

这是国内第一个关于Nim的系列教程 先说废话 很开心,在今天凌晨快一点多的时候拿到了 nim-lang.com;nim-lang.cn;nim-lang.net...

1815
来自专栏大数据钻研

JAVA基础

一个Java程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作。 下面简要介绍下类、对象、方法和实例变量的概念。 对象:对象是类的一个实例,...

2627
来自专栏人工智能LeadAI

装饰器 | Python高级编程

装饰器的理解 装饰器是程序开发中经常会用到的一个功能,用好了装饰器,开发效率如虎添翼,所以这也是Python面试中必问的问题,但对于好多初次接触这个知识的人来讲...

3524
来自专栏大闲人柴毛毛

剑指 offer代码解析——面试题29数组中出线次数超过一半的数字

题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 分析:本题最直观的思路就是分别统计数组中每个数出现的次数,然后求出最大值,判断是否超过...

3276
来自专栏漫漫深度学习路

c++复杂声明

void (*funcPtr)(); 上面声明了一个指向函数的指针,当碰到这样一个比较复杂的声明时,最好的方法是从 中间开始和向外扩展: 从中间开始:即 从变量...

1697
来自专栏coding for love

待整理01-JS 形参与变量声明和函数声明同名怎么办?

前两天遇到一道很有意思的题目,乍看起来是一道考声明提升和变量提升的题目的,但事实上还包含了更多的知识点。下面我们一起来看一下。

773

扫码关注云+社区