传递指针参数,在C++中传递值?

Sul*_*lla 29 c++ pointers function pass-by-value

传递指针参数,在C++中传递值?因为我看到指针的任何更改都不会反映在方法之外.我通过解除引用指针所做的更改会被反映出来.

在这种情况下,使用指针指向函数的参数是否可以接受/标准过程来修改函数中的指针值?

kri*_*iss 38

对两者都是.

指针通过值传递为其他任何东西.这意味着复制指针变量的内容(指向的对象的地址).这意味着如果更改函数体中指针的值,则该更改将不会反映在仍将指向旧对象的外部指针中.但是您可以更改指向的对象的值.

如果要反映对指向外部指针的指针所做的更改(使其指向其他指针),则需要两个间接级别(指针指针).调用函数时,通过&在指针名前加一个来完成它.它是标准的C做事方式.

使用C++时,使用引用优先于指针(此后也指向指针).

对于为什么引用应首选指针,有几个原因:

  • 引用引入的语法噪声少于函数体中的指针
  • 引用保留比指针更多的信息,而不是对编译器有用

参考文献的缺点主要是:

  • 它们打破了C的简单的按值传递规则,是什么使得理解函数关于参数的行为(它们会被改变吗?)不那么明显.你还需要功能原型.但这并不比使用C时所需的多指针级别更差.
  • 它们不受C支持,当你编写应该兼容C和C++程序的代码时,这可能是一个问题(但这不是最常见的情况).

在指向指针的特定情况下,差异主要是简单性,但使用引用它也可以很容易地删除两个指针级别并且只传递一个引用而不是指向指针的指针.


Ati*_*nar 9

我理解这里的困惑."按值传递"和"按参考传递"的概念即使看起来如此也不是那么清楚.请记住,计算机不知道这些概念,并且不依据它.计算机不知道类型.因此,它没有区分指针和值.让我试着用例子解释一下:

void func1(int x)
{
   x = 5;
}

void func2(int *x)
{
   int a;
   x = &a;
}
Run Code Online (Sandbox Code Playgroud)

两个函数中的机器操作相同:它获取参数并更改它.请注意,在第二个函数中,它不会修改*x,它会修改x.

现在,如果我们称这些功能,

int y = 10;

func1(y); //value of y does not change

func2(&y); //value of &y does not change, but the value of the address which y points may change. 
Run Code Online (Sandbox Code Playgroud)

我更喜欢说,基本上,每个函数调用都是"按值调用".但是在指针类型的情况下,我们有办法改变内存中另一个地址的内容.

如果我们写的func2

void func2(int *x)
{ 
   *x = 5; 
}
Run Code Online (Sandbox Code Playgroud)

然后,这将是"通过引用调用"的真实案例.