转载:https://blog.csdn.net/jiangxinyu/article/details/7767065

在 C++中,数组永远不会按值传递,它是传递第一个元素,准确地说是第 0个 的指针。

例如,如下声明 :
void putValues( int[ 10 ] ); 
被编译器视为  
void putValues( int* ); 
数组的长度与参数声明无关,因此,下列三个声明是等价的: 
// 三个等价的 putValues()声明 
void putValues( int* ); 
void putValues( int[] ); 
void putValues( int[ 10 ] );

因为数组被传递为指针 所以这对程序员有两个含义:

1. 在被调函数内对参数数组的改变将被应用到数组实参上而不是本地拷贝上,当用作实参的数组必须保持不变时,程序员需要保留原始数组的拷贝函数可以通过把参数类型声明为 const 来表明不希望改变数组元素。
void putValues( const int[ 10 ] );

2.  数组长度不是参数类型的一部分,函数不知道传递给它的数组的实际长度,编泽器也不知道,当编译器对实参类型进行参数类型检查时,并不检查数组的长度。例如:
void putValues( int[ 10 ] ); // 视为 int*

int main() { 
int i, j[ 2 ]; 
putValues( &i ); // ok: &i 是 int*; 潜在的运行错误 
putValues( j ); // ok: j 被转换成第 0 个元素的指针 
// 实参类型为 int*: 潜在的运行错误 
return 0; 
}

参数的类型检查只能保证putValues()的两次调用都提供了int*型的实参,类型检查不能检验实参是一个 10元素的数组 。习惯上, C风格字符串是字符的数组,它用一个空字符编码作为结尾。但是所有其他类型,包括希望处理内含空字符的字符数组必须以某种方式在向函数传递实参时使其知道它的长度。

一种常见的机制是提供一个含有数组长度的额外参数。例如:
void putValues( int[], int size );
int main() { 
       int i, j[ 2 ]; 
       putValues( &i, 1 ); 
       putValues( j, 2 ); 
       return 0; 
}

另外一种机制是将参数声明为数组的引用

当参数是一个数组类型的引用时,数组长度成为参数和实参类型的一部分,编译器检查数组实参的长度与在函数参数类型中指定的长度是否匹配。 
// 参数为 10 个 int 的数组 
// parameter is a reference to an array of 10 ints 
void putValues( int (&arr)[10] );//不能写成&arr[10],因为下标操作符的优先级较高
int main() { 
       int i, j[ 2 ]; 
       putValues( i ); // 错误: 实参不是 10 个 int 的数组 
       putValues( j ); // 错误: 实参不是 10 个 int 的数组 
       return 0; 
}

数组引用:C++ 数组做参数 深入分析的更多相关文章

  1. [转]数组引用:C++ 数组做参数 深入分析

    "数组引用"以避免"数组降阶"(本文曾贴于VCKBASE\C++论坛) 受[hpho]的一段模板函数的启发,特写此文,如有雷同,实在遗憾. 数组降阶是个讨厌的事 ...

  2. C++二维数组(指针)做参数

    一.问题描述 使用C++编程过程中经常需要使用到二维数组,然而初级程序员在使用过程中经常会出错使程序崩溃.下面就二维指针的定义,初始化,以及二维指针做参数给出简单介绍. 1.二维数组的定义与初始化 在 ...

  3. C++数组引用

    C++数组引用 一.数组引用 C++数组的引用:引用即别名这样比指针传地址方便多了 形参中的(&a)[10]可以就看做a数组的别名,肯定要指定数组大小,如果没有后面的数组大小,天知道是变量还是 ...

  4. C++数组做参数

    首先,看一下下面这段代码: void changearr(int a[],int n){    cout<<sizeof(a)<<endl;         // 输出4}in ...

  5. C++ 中数组做参数的分析

    C++ 中数组做参数的分析 1.数组降价问题? "数组引用"以避免"数组降阶",数组降阶是个讨厌的事,这在C语言中是个无法解决的问题,先看一段代码,了解什么是& ...

  6. C语言 函数理解(以数组做参数)

    #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> int run(int *p){ // ...

  7. 引用、数组引用与指针引用、内联函数inline、四种类型转换运算符

    一.引用 (1).引用是给一个变量起别名 定义引用的一般格式:类型  &引用名 = 变量名: 例如:int a=1;  int  &b=a;// b是a的别名,因此a和b是同一个单元 ...

  8. perl 引用(数组和hash引用) --- perlreftut - Mark 的一个简单的'引用'教程 ---Understand References Today. --Mark Jason Dominus, Plover Systems (mjd-perl-ref+@plover.com)

    https://blog.csdn.net/fangwei1235/article/details/8570886 首页 博客 学院 下载 论坛 APP 问答 商城 活动 VIP会员 招聘 ITeye ...

  9. js 数组引用 发现的问题

    最近做项目时,要对返回的数据[保存在json数组中]做一次修改,但原数据要保留一次做备用.首先想到,原数据不动,用一个临时的变量来修改,大致模型就是这样: // 原始: a=[1,2,3,4,5,.. ...

随机推荐

  1. python_hashlib模块

    1 网站登陆 import random import string import pickle # data1 = string.ascii_letters # print("data1数 ...

  2. 研究并尝试改进Vyeshal

    我想研究Vyeshal,这样就不可避免的要用到游戏中的语音.然而游戏内的语音文件是.bank类型的,如何转化为可听文件是个问题.

  3. 傻瓜学编程之block_3

    block 捕获自动变量的瞬间值: 注释在代码中:请参考傻瓜学编程之block_3 import "People.h" @interface People() { int your ...

  4. Android 开发 Camera类的拍照与录像

    前言 在开发Android应用的时候,如果需要调用摄像头拍照或者录像,除了通过Intent调用系统现有相机应用进行拍照录像之外,还可以通过直接调用Camera硬件去去获取摄像头进行拍照录像的操作.本篇 ...

  5. matlab-调用摄像头人脸识别

    ----------------------------边学边写边学习------------------------------------- 版本:2014a 调用摄像头 a = imaqhwin ...

  6. hive 学习

    多表查询 SELECT a.user_uid_type, a.user_uid, c.user_id, c.user_type FROM mytable1 a JOIN mytable2 b ON(a ...

  7. sublime编译javaScript脚本

    处理步骤: 1. 首先到 nodejs.org 下载 Node.js 安装包并安装.2. 打开 Sublime Text 3 编辑器.选择菜单 Tools --> Build System -- ...

  8. visual studio开启多核编译方法《转》

    原文:https://blog.csdn.net/acaiwlj/article/details/50240625 visual studio在编译时可以启动多核并行编译,以减少编译所需时间.话不多说 ...

  9. a 标签实现分享功能

    在网页中,经常会用到分享功能,例如分享到qq,分享到微信,分享到微博等,但是怎么实现呢?一直没有想清楚这个问题,觉得好高大上的样子,于是在网上找了一些资料,也没有看出个什么所以然来: 于是有些心急了, ...

  10. 使用IntelliJ IDEA 配置Maven

    创建一个本地仓库路径 配置本地仓库路径 配置maven环境变量 配置maven环境变量 打开命令输入 : mvn version,配置成功如下图所示: 在IntelliJ IDEA中配置maven f ...