C++数组作为函数参数的几个问题(转)

本文需要解决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[0]) << endl;

  cout << "changing the 4th element‘s value to 10." << endl;
  a[3] = 10;
}

int main()
{
  int a[] = {1, 2, 3, 4, 5};

  cout << "in main..." << endl;
  cout << "array address: " << a << endl;
  cout << "array size: " << sizeof(a) << endl;
  cout << "array element count: " << sizeof(a) / sizeof(a[0]) << endl;

  testArrayArg(a);

  cout << endl << "the 4th element‘s value: " << a[3] << endl;

  return 0;
}

运行结果如下:

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 - 1] << endl;
}

可在main()中这样调用:

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

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

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

时间: 2024-12-28 16:18:03

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

编程题:用一组数组做函数参数来实现,输入两个数,输出其中最大数

#include<stdio.h> float max(float x,float y) { float z; if(x>y)z=x; else z=y; return z; } void main() { float a[2],c; scanf("%f,%f",&a[0],&a[1]); c=max(a[0],a[1]); printf("%f,%f,the max is %f\n",a[0],a[1],c); } 编程题:用一组

C语言--- 高级指针2(结构体指针,数组作为函数参数)

一.结构体指针 1. 什么是结构体指针?指向结构体变量的指针     结构体:     typedef  struct stu{                          char name[20];                          char sex;                          int age;                    }Student;     Student stu1 = {"zhangsan",'m',23};  

c语言中二维数组作函数参数以及二维数组的理解

当二维数组作函数参数接受主调函数中的二维数组时,退化为一个指向数组的指针. 在此引用<c与指针>中的观点:作为函数 参数的多位数组名的穿递方式和一维数组名相同--实际传递的是个指向数组第一个元素的指针.但是,两者之间的区别在于, 多维数组的每个元素本身是另外一个数组,编译器需要知道它的维数,以便为函数形参的下标表达式进行求值.

二维数组作为函数参数的几种方法

#include <stdio.h> #define N 5 void fun1(int a[N][N]) { int i,j; for (i=0;i<N;i++) { for (j=0;j<N;j++) { if (i>j) { a[i][j]+=a[j][i]; a[j][i]=0; } } } } void fun2(int **a,int m,int n) { int i,j; for (i=0;i<m;i++) { for (j=0;j<n;j++) {

二维数组作为函数参数深度详解

        前几天和同学讨论数组作为函数参数,感觉各种困惑.花了一些时间在网上查看了一些资料,并加上自己的理解.记录一下! 一. 指向指针的指针和指向数组的指针 很多人以为"指向数组的指针"就是"指向指针的指针",于是有人写这样的代码: int a[3][4]; int **p = a; //错误 数组实际类型是int [3][4],在作为右值时可以被转化为int (*)[4],它们都和int **不同,自然不可用. 那么,你要用一个指针来指向a,就要用一个

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

//数组做函数参数不传数组个数的遍历方法 #include<stdio.h> #include<stdlib.h> #include<string.h> void PrintfAK(char **pin){ int i = 0; //关键点:pin[i]!=NULL为终止条件 for (i = 0; pin[i]!=NULL; i++) { printf("%s\n", pin[i]); } } void main(){ //赋值数组最后一个元素是0

数组作为函数参数

一.一维数组名作函数参数 用数组名作函数参数,应该在主调函数和被调函数分别定义数组,例如 <span style="font-size:18px;">void main() { void f(int b[10]);//void f(int b[]) int a[10]; f(a); }</span> 在被调用函数中声明了形参数组的大小为10,但在实际中,指定其大小是不起任何作用的,因为C语言编译对形参数组大小不做检查,只将实参数组的首元素地址传给形参数组.形参数

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

1. 用数组元素作函数实参 1 #include <iostream> 2 using namespace std; 3 4 int max_value(int x, int max) 5 { 6 return max > x ? max : x; 7 } 8 9 int main() 10 { 11 const int x = 3, y = 4; 12 int a[x][y]={{34,62,34,101},{45,67,3,0},{11,45,97,100}}; 13 int max

C-二维数组作为函数参数, 字符数组

1. 如果函数的参数是一个一维数组, 那么我们在传递的时候, 可以传递二维数组的某1行——一个一维数组 2. 二维数组可以作为函数的参数: 如果函数的参数是一个二维数组, 那么传入的实参也必须是一个相同类型的二维数组 3. 同一维数组一样, 当二维数组作为函数的参数的时候, 函数也是声明的一个指针指向传入的二维数组, 并通过指针对传入的二维数组进行操作 4. 当二维数组作为函数的参数的时候, 行数可以不写, 但是列数必须要写 5. 所以跟一维数组一样, 当二维数组作为函数参数是, 函数的参数还要