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()中便可安全地访问数组元素了。

C++中,将数组作为函数参数传递是一种常见的做法,但是需要注意的是,C++并不像某些动态语言那样支持传入整个数组引用,而是复制整个数组或是使用指针间接访问数组元素。这里有几种常见的方式: 1. **按值传递**(Pass by Value): 如果数组是常量引用(const),那么数组会被复制一份传递给函数。如果数组不是常量,会复制整个数组的内容。 ```cpp void processArray(int arr[], int size); // 函数声明 void processArray(const int arr[]) { // 使用const避免无意修改数组 for (int i = 0; i < size; ++i) { // 对数组元素进行操作 } } int main() { int myArr[] = {1, 2, 3}; processArray(myArr, sizeof(myArr)/sizeof(myArr[0])); // 传递副本 return 0; } ``` 2. **按引用传递**(Pass by Reference): 可以通过指针或引用直接操作数组内容,这种方式可以避免不必要的数组复制,提高效率。 ```cpp void processArray(int* arr, int size); void processArray(int(&arr)[size]) { // 或者使用数组引用 for (int i = 0; i < size; ++i) { // 直接操作数组元素 *arr[i] } } // 使用方法同上 ``` 3. **数组长度作为额外参数**: 当数组大小未知时,可以将数组长度作为单独的参数传递。 ```cpp void processArray(int arr[], int size); // ... int main() { int myArr[] = {1, 2, 3}; int n = sizeof(myArr)/sizeof(myArr[0]); processArray(myArr, n); } ``` 4. **C风格的数组指针**: 这种方式传递的是数组的第一个元素的地址,适用于静态数组。 ```cpp void processArray(int* arr); // ... int main() { int myArr[] = {1, 2, 3}; processArray(myArr); } ``` 记得在函数内部谨慎操作数组,尤其是避免越界。同时,为了代码的清晰性和安全性,推荐使用指针加上数组长度的方式来处理动态大小的数组
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值