Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;通过引用传递静态数组和动态数组 >为了完全理解指针、值和引用的工作方式,我正在制作一个基本的C++程序,试图篡改一些静态和动态数组,并理解它们应该如何传入。_C++_Arrays_Pointers_Reference_Pass By Reference - Fatal编程技术网

C++;通过引用传递静态数组和动态数组 >为了完全理解指针、值和引用的工作方式,我正在制作一个基本的C++程序,试图篡改一些静态和动态数组,并理解它们应该如何传入。

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

首先,我生成一个包含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;
    }
}
#包括“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
中取消对so
cout的引用,或者按照我自己的说法,再进一步,您没有传递数组没有通过引用传递(仅当参数类型为引用类型时才会发生这种情况,即使用
&
)。参数的类型为
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; }