本文需要解决C++中关于数组的2个问题:
1. 数组作为函数参数,传值还是传址?
2. 函数参数中的数组元素个数能否确定?

先看下面的代码。

#include <iostream>

using namespace std;

void testArrayArg(int a[])
{
cout << endl; cout << "in func..." << endl;
cout << "array address: " << a << endl;
cout << "array size: " << sizeof(a) << endl;
cout << "array element count: " << sizeof(a) / sizeof(a[]) << endl; cout << "changing the 4th element's value to 10." << endl;
a[] = ;
} int main()
{
int a[] = {, , , , }; cout << "in main..." << endl;
cout << "array address: " << a << endl;
cout << "array size: " << sizeof(a) << endl;
cout << "array element count: " << sizeof(a) / sizeof(a[]) << endl; testArrayArg(a); cout << endl << "the 4th element's value: " << a[] << endl; return ;
}

运行结果如下:

in main...
array address: 0012FF4C
array size: 20
array element count: 5

in func...
array address: 0012FF4C
array size: 4
array element count: 1
changing the 4th element's value to 10.

the 4th element's value: 10

当我们直接将数组a作为参数调用testArrayArg()时,实参与形参的地址均是0012FF4C。并且,在testArrayArg()中将a[3]的值修改为10后,返回main()函数中,a[3]的值也已经改变。这些都说明C++中数组作为函数参数是传址

特别需要注意的是,在main()中,数组的大小是可以确定的。

array size: 20
array element count: 5

但作为函数参数传递后,其大小信息丢失,只剩下数组中第一个元素的信息。

array size: 4
array element count: 1

这是因为C++实际上是将数组作为指针来传递,而该指针指向数组的第一个元素。至于后面数组在哪里结束,C++的函数传递机制并不负责。

上面的特性可总结为,数组仅在定义其的域范围内可确定大小

因此,如果在接受数组参数的函数中访问数组的各个元素,需在定义数组的域范围将数组大小作为另一辅助参数传递。则有另一函数定义如下:

void testArrayArg2(int a[], int arrayLength)
{
cout << endl << "the last element in array is: " << a[arrayLength - ] << endl;
}

可在main()中这样调用:

testArrayArg2(a, sizeof(a) / sizeof(a[0]));

这样,testArrayArg2()中便可安全地访问数组元素了。

转自:http://blog.csdn.net/sarkuya/article/details/6554538

C++数组作为函数参数的几个问题(转)的更多相关文章

  1. C语言 数组做函数参数不传数组个数的遍历方法

    //数组做函数参数不传数组个数的遍历方法 #include<stdio.h> #include<stdlib.h> #include<string.h> void ...

  2. C语言 数组做函数参数退化为指针的技术推演

    //数组做函数参数退化为指针的技术推演 #include<stdio.h> #include<stdlib.h> #include<string.h> //一维数组 ...

  3. ​C语言数组作为函数参数

    数组可以作为函数的参数使用,进行数据传送. 数组用作函数参数有两种形式,一种是把数组元素(下标变量)作为实参使用:另一种是把数组名作为函数的形参和实参使用. 数组元素作函数实参 数组元素就是下标变量, ...

  4. [C++程序设计]用数组名作函数参数

    1. 用数组元素作函数实参 #include <iostream> using namespace std; int max_value(int x, int max) { return ...

  5. 用C++11实现C++17的apply(动态数组用作函数参数)

    标题有点错误,apply是用tuple做参数,调用一个函数.这个标题是为了能更好的适配搜索关键字. 动态数组用作函数参数更适合嵌入了脚本环境的C++程序,比如lua或javascript(js). 若 ...

  6. C-指针,二级指针,二维数组作为函数参数使用,C语言链表(详解)

    一级指针 int *p;            //表示定义一个int型(4字节)的指针p &p                 //表示p自身的地址位置 p                  ...

  7. go语言基础之数组做函数参数是值拷贝

    1.数组做函数参数是值拷贝 示例: package main //必须有个main包 import "fmt" //数组做函数参数,它是值传递 //实参数组的每个元素给形参数组拷贝 ...

  8. [GO]数组做函数参数

    package main import "fmt" //数组为函数参数,实际上是值传递//实参数据里的每个元素,给形参数组拷贝一份//这里形参的数组其实就是实参的复制品 func ...

  9. 3205: 数组做函数参数--数组元素求和1--C语言

    3205: 数组做函数参数--数组元素求和1--C语言 时间限制: 1 Sec  内存限制: 128 MB提交: 178  解决: 139[提交][状态][讨论版][命题人:smallgyy] 题目描 ...

  10. 3204: 数组做函数参数--排序函数2--C语言

    3204: 数组做函数参数--排序函数2--C语言 时间限制: 1 Sec  内存限制: 128 MB提交: 211  解决: 143[提交][状态][讨论版][命题人:smallgyy] 题目描述 ...

随机推荐

  1. net8:文本文件的创建及其读写

    原文发布时间为:2008-08-06 -- 来源于本人的百度文章 [由搬家工具导入] using System;using System.Data;using System.Configuration ...

  2. PSEUDO LEAST RECENTLY USED (PLRU) CACHE REPLACEMENT

    A multi-way cache system includes multi-way cache storage circuitry, a pseudo least recently used (P ...

  3. echarts 图表用例

    参考博客:http://blog.csdn.net/verne_feng/article/details/51731653 http://echarts.baidu.com/echarts2/doc/ ...

  4. 高效的MySQL的批插入 BULK INSERT

    原文:http://www.open-open.com/code/view/1453702496573 MySQL的批插入 BULK INSERT和load data的速度差不多,并且可靠. 语法如下 ...

  5. paddle中新增layer

    Implement C++ Class The C++ class of the layer implements the initialization, forward, and backward ...

  6. fedora关闭防火墙

    sudo systemctl stop iptables sudo sytemctl stop firewalld

  7. svn 创建分支、切换分支 及 合并分支 操作

    关联远程仓库: 右键  ---  点击 ' SVN Checkout...' 生成 打开trunk目录,在trunk目录下新建两个文本文件A.java,B.java: 打开A.java输入以下内容: ...

  8. Android Studio——gradle同步出错:MALFORMED

    Android Studio之前使用本地的gradle-2.10,而后创建新的工程总是报错,信息如下: Gradle sync failed: MALFORMED 而后在File->Projec ...

  9. c程序设计语言第一章1

    1,c程序都是由函数和变量组成的. 练习1.6验证布尔表达式getchar()!= EOF的取值是0还是1 答: #include <stdio.h> #include <stdli ...

  10. mysql添加删除索引,查看某个表的建表语句

    查看某个表的建表语句 :show create table data_statdata; drop index ts on data_statdata; 索引是加速查询的主要手段,特别对于涉及多个表的 ...