【发布时间】:2015-02-26 04:44:25
【问题描述】:
为了完全理解指针、值和引用是如何工作的,我正在编写一个基本的 C++ 程序,该程序试图篡改一些静态和动态数组,并准确理解它们应该如何传入。
首先我生成一个包含 3 个元素的静态数组。然后我将它传递给一个修改所有元素的函数。然后我将它传递给另一个签名稍有不同的函数,但也可以更改数组的值。
接下来我生成一个动态大小的数组,通过引用将它传递给一个函数,以便可以更改这个动态大小的数组中的所有值。
代码如下:
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
void changeIndexStaticArrayMethod1(int* stat);
void changeIndexStaticArrayMethod2(int (&stat)[3]);
void changeIndexDynamicArrayMethod1(int* dyn, int size);
int main() {
const int MAX = 3;
int arr[MAX] = { 1,2,3 };
changeIndexStaticArrayMethod1(arr);
cout << arr[0] << endl;
cout << arr[1] << endl;
cout << arr[2] << endl;
cout << endl;
changeIndexStaticArrayMethod2(arr);
cout << arr[0] << endl;
cout << arr[1] << endl;
cout << arr[2] << endl;
int SIZE;
cout << "Please choose a size for the array" << endl;
cin >> SIZE;
int *ne = new int[SIZE];
//Build array
for (int i = 0; i < SIZE; i++) {
ne[i] = i;
}
changeIndexDynamicArrayMethod1(ne, SIZE);
for (int i = 0; i < SIZE; i++) {
cout << "ne[" << i << "] = " << ne[i] << endl;
}
//To hang program
cin >> SIZE;
delete[] arr;
delete[] ne;
return 0;
}
void changeIndexStaticArrayMethod1(int* stat) {
stat[0] = 10;
stat[1] = 20;
stat[2] = 30;
}
void changeIndexStaticArrayMethod2(int (&stat)[3]) {
stat[0] = 40;
stat[1] = 50;
stat[2] = 60;
}
void changeIndexDynamicArrayMethod1(int* dyn, int size) {
for (int i = 0; i < size; i++) {
dyn[i] = i * 10;
}
}
以上所有代码都按我的意愿工作,我只是对为什么有几个问题(我在其他 SO 问题上找到了一些通过引用传递数组的方法)。
-
在changeIndexStaticArrayMethod1() 和changeIndexDynamicArrayMethod1() 函数中,为什么我们可以使用解引用
*操作符作为我们数组的引用?我的下意识反应是,实际上是按值传递数组,因为它是取消引用运算符。我知道使用数组,它与使用变量有很大不同,而且,为什么以下内容不适用于单个int变量:void changeStaticNumber(int* num){ 数 = 100; }
显然,如果我们使用&num 而不是int* num,上述方法将起作用,显然我并不完全理解指针和数组之间的关系,但我无法弄清楚为什么当我们通过引用传递数组时,@ 987654327@就可以了。
对我遇到的这些问题的任何解释将不胜感激。谢谢。
【问题讨论】:
-
当数组作为参数传递给函数时,它会衰减为指针。参见例如stackoverflow.com/questions/1461432/what-is-array-decaying.
-
所以我会在将它传递给函数时与它进行交互,就像我与指向某种地址的常规旧指针变量进行交互一样?
-
指针指向数组的第一个元素。您可以像使用原始数组标识符一样使用它,除了丢失有关数组中元素数量的信息(并且 sizeof 不再有效)。
-
你也忘了尝试
std::vector!
标签: c++ arrays pointers reference pass-by-reference