C++;通过引用传递静态数组和动态数组 >为了完全理解指针、值和引用的工作方式,我正在制作一个基本的C++程序,试图篡改一些静态和动态数组,并理解它们应该如何传入。
首先,我生成一个包含3个元素的静态数组。然后我将其传递到一个修改所有元素的函数中。然后,我将其传递到另一个签名稍有不同的函数中,但也可以更改数组的值 接下来,我生成一个动态大小的数组,通过引用将其传递到一个函数中,以便可以更改这个动态大小数组中的所有值 代码如下:C++;通过引用传递静态数组和动态数组 >为了完全理解指针、值和引用的工作方式,我正在制作一个基本的C++程序,试图篡改一些静态和动态数组,并理解它们应该如何传入。,c++,arrays,pointers,reference,pass-by-reference,C++,Arrays,Pointers,Reference,Pass By Reference,首先,我生成一个包含3个元素的静态数组。然后我将其传递到一个修改所有元素的函数中。然后,我将其传递到另一个签名稍有不同的函数中,但也可以更改数组的值 接下来,我生成一个动态大小的数组,通过引用将其传递到一个函数中,以便可以更改这个动态大小数组中的所有值 代码如下: #include "stdafx.h" #include <iostream> #include <string> using namespace std; void changeIndexStaticAr
#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;
}
}
#包括“stdafx.h”
#包括
#包括
使用名称空间std;
void changeIndexStaticarayMethod1(int*stat);
void changeIndexStaticArrayMethod2(int(&stat)[3]);
void changeIndexDynamicArrayMethod1(int*dyn,int-size);
int main(){
常数int MAX=3;
int-arr[MAX]={1,2,3};
ChangeIndexStaticCarrayMethod1(arr);
让我看看能不能试试这个
指针只是地址持有者。一旦你做了int*ptr=myarray;---你在tern中做的是将指针的地址存储到我的数组中---数组名实际上是指向数组中第一个内存位置的指针。你可以使用指针算法来获取其他所有内容,例如myarray+1将指向下一个位置或myarray[1]
当您需要修改数组时,按值传递不是很有用。按引用传递实际上是创建一个指向数组的指针并传递该指针。因为像向量这样的数组是连续的内存块,所以可以很容易地对它们进行索引
就您的示例而言,void changesticnumber(int*num){num=100;}将不起作用,因为您尝试将100存储到指针的地址中它会起作用,因为实际上您正在进一步访问num所指向的数据。当您使用&num时,它本质上是相同的东西-&只是给您一些东西的地址
例如,如果你想把一个指针指向一个int,你要做的是
int num=5;
int*ptr=&num;
此时,ptr在num中有相同的地址。要打印num中的数据或ptr指向的数据,您需要在changeIndexStaticArrayMethod1
和changeIndexDynamicArrayMethod1
中取消对socout的引用,或者按照我自己的说法,再进一步,您没有传递数组没有通过引用传递(仅当参数类型为引用类型时才会发生这种情况,即使用&
)。参数的类型为int*
(指针指向int
)。您通过值传递指向int
的指针。两个函数中都没有“取消引用运算符”
ne
已经是一个int*
,所以传递它没有什么特别。arr
是一个int[3]
,一个数组,而不是指针。在C中,当在需要指向-T
的指针的上下文中使用-T
的数组时,它会被隐式转换(无需执行任何操作)指向其第一个元素的指针。因此,当您执行时,changeIndexStaticArrayMethod1(arr)
,编译器将获取指向arr
的第一个元素的指针,并将其传递给函数
[]
运算符在指针上工作。a[i]
始终保证与*(a+i)
相同。在changeIndexStaticArrayMethod1
和changeIndexDynamicArrayMethod1
函数中,使用指向第一个元素的指针来访问后续元素
为什么我们可以使用数组的解引用*操作符作为引用
C中的*
表示很多东西。它可以表示一元间接(“contents of”)运算符,也可以表示二进制乘法运算符,还可以表示指针声明。int*stat
是指针声明
由于您没有使用*
来取消对该函数中指针内容的引用,因此我不太确定您在问什么
在main()中获取数组的数组名时,它会“衰减”为指向第一个元素的指针。因此,这些函数所做的是按值获取指针。如果通过键入*stat=something;
取消对指针的引用,则访问main中的实际数组
如果您做了一些奇怪的事情,例如更改指针本身,例如stat++;
,那么它将不会影响main中使用的地址。您通过值传递指针本身,因此指针是本地副本
我下意识的反应是,这实际上是通过值传递数组,因为它是解引用操作符
不能通过C或C++中的值传递数组,而不必使用脏的技巧(将它们存储在结构或类中)。例如,函数被写为<代码>空隙CyeEntXxTestCARayMult1(int STAT(3))
它仍然会给您一个指向第一个元素的指针。它不会按值传递数组,因为语法可能会诱使您相信
为什么以下内容不适用于单个int变量:
因为num
是指针本身,而不是它的内容。为了编写这样的代码,您可以通过引用int&num
传递变量。在这些行后面,这实际上与传递指针相同,只是语法简化了
< >为了更好地理解指针和数组之间的关系,首先阅读这一章:(C和C++在指针上是相同的)。当数组作为参数传递给函数时,数组就会衰减到指针。
void changeStaticNumber(int* num){ num = 100; }