C++ 在C+中为什么以及在何处使用引用和指针+;

C++ 在C+中为什么以及在何处使用引用和指针+;,c++,pointers,reference,C++,Pointers,Reference,可能重复: 我是一个非常新的C/C++语言编程人员,因为我来自C++、java、JavaScript和一点Visual Basic和Python的背景,我很难理解C++中的一些东西。 我已经知道如何使用引用和指针,以及它们的真正含义等,但我不明白为什么以及在哪里使用它们。我知道引用有时是这样使用的: int x = 2; void Square(int &value) { value = value*value; } Square(x); cout << x &

可能重复:

<>我是一个非常新的C/C++语言编程人员,因为我来自C++、java、JavaScript和一点Visual Basic和Python的背景,我很难理解C++中的一些东西。 我已经知道如何使用引用和指针,以及它们的真正含义等,但我不明白为什么以及在哪里使用它们。我知道引用有时是这样使用的:

int x = 2;

void Square(int &value)
{
   value = value*value;
}

Square(x);

cout << x << endl;
int x = 2;

int Square(int value)
{
   value = value*value;
   return value;
}

x = Square(x);

cout << x << endl;
intx=2;
空方块(整数和值)
{
值=值*值;
}
正方形(x);

cout第二个示例将本地复制变量
x
(仅在
Square
函数中可见)


如果您想确保您的全局
x
保持不变,请这样做。但是,它可能非常昂贵(如果您的变量是更大的object/struct)。。。和冗余-签出关键字
const

第二个示例将本地复制变量
x
(仅在
Square
函数中可见)


如果您想确保您的全局
x
保持不变,请这样做。但是,它可能非常昂贵(如果您的变量是更大的object/struct)。。。和冗余-签出关键字
const
将参数作为引用传递意味着您将修改其值(如果对其执行某些操作),而不是修改其副本变量的值。 由于使用了&value,它会更改存储在&value所指地址处的内容

您需要在Squre()中传递&x而不是x

因此x=Squre(&x)

Squre&x


相同。

将参数作为引用传递意味着要修改其值(如果对其执行某些操作),而不是修改作为其副本的变量的值。 由于使用了&value,它会更改存储在&value所指地址处的内容

您需要在Squre()中传递&x而不是x

因此x=Squre(&x)

Squre&x


相同。

传递引用有两个主要原因:

  • 更改函数中引用的对象的值
  • 以避免复制传递的对象的成本
如果您想要第二个好处而不是第一个好处,通常会传递一个
const
引用,以避免错误地更改传递的对象

在C++中,指针和引用与两个例外情况大致相同:

  • 引用不能指向0(或
    nullptr
  • 引用必须始终指向同一对象
如果你想做这些事情之一,你必须使用一个指针

此外,指针通常指向使用
new
在堆中创建的对象,而引用通常指向在堆栈中创建的对象。这意味着指针指向的对象的生存期通常是手动控制的。为了销毁由
new
创建的对象,您必须显式调用
delete
,但在堆栈中创建的对象的生存期由运行时自动管理(因此它们的名称为“自动变量”)


我不知道这是你需要知道的全部,还是你在寻找更具体的东西。

你传递参考资料有两个主要原因:

  • 更改函数中引用的对象的值
  • 以避免复制传递的对象的成本
如果您想要第二个好处而不是第一个好处,通常会传递一个
const
引用,以避免错误地更改传递的对象

在C++中,指针和引用与两个例外情况大致相同:

  • 引用不能指向0(或
    nullptr
  • 引用必须始终指向同一对象
如果你想做这些事情之一,你必须使用一个指针

此外,指针通常指向使用
new
在堆中创建的对象,而引用通常指向在堆栈中创建的对象。这意味着指针指向的对象的生存期通常是手动控制的。为了销毁由
new
创建的对象,您必须显式调用
delete
,但在堆栈中创建的对象的生存期由运行时自动管理(因此它们的名称为“自动变量”)


我不知道这是您需要知道的全部,还是您正在寻找更具体的内容。

引用只是变量的伪名称。应用于引用的任何操作实际上都会影响所引用的变量

int a = 5;
int &b = a;
b++; // 'a' gets equal to 6
在您的示例中,您返回乘法的结果,但如果您需要更改传递给一个不返回任何结果的函数的变量的值,该怎么办


这就是引用变得方便的时候。指针的行为与此类似,只是指针不是变量的伪名称,而是它的地址。您可以将指向变量的指针传递给函数,取消对它的引用,它将以完全相同的方式影响您的变量。

引用只是变量的伪名称。应用于引用的任何操作实际上都会影响所引用的变量

int a = 5;
int &b = a;
b++; // 'a' gets equal to 6
在您的示例中,您返回乘法的结果,但如果您需要更改传递给一个不返回任何结果的函数的变量的值,该怎么办


这就是引用变得方便的时候。指针的行为与此类似,只是指针不是变量的伪名称,而是它的地址。您可以将指向变量的指针传递给函数,取消对它的引用,它将以完全相同的方式影响您的变量。

这样的示例在实际中没有什么区别,但与其将整数传递给
Square()
,不如设想Square是一个复杂的算法,需要10 GB的数据。使用指针不是更好吗,这样参数就不会
int i;  
Int &ref = i;  
Int *pointer = &i;