41

是否传递指针参数,在 C++ 中按值传递?因为我看到对指针的任何更改都不会反映在方法之外。我通过取消引用指针所做的更改被反映了。

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

4

5 回答 5

51

两者都是。

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

如果要将指针所做的更改反映到外部指针(使其指向其他内容),则需要两个间接级别(指向指针的指针)。&当调用函数时,它是通过在指针名称之前放置一个来完成的。这是标准的 C 做事方式。

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

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

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

参考文献的缺点主要是:

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

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

于 2010-12-13T07:05:32.467 回答
13

我理解这里的混乱。“按值传递”和“按引用传递”的概念并不那么清晰,即使它们看起来如此清晰。请记住,计算机不知道这些概念,也不会按照它行事。计算机不知道类型。因此,它不区分指针和值。让我尝试通过示例来解释:

void func1(int x) //copy some value to local variable x (of type int)
{
   x = 5; //modify local variable. lost after function call
}

void func2(int *x) //copy some value to local variable x (of type int*)
{
   int a;
   x = &a; //modify local variable. lost after function call.
}

void func3(int *x) //copy some value to local variable x(of type int*)
{
   *x = 10; //x is local but *x is not! change is saved after function call!
}

func1 和 func2 是相同的。两者都修改局部变量。函数从堆栈中弹出后修改丢失。func3 有能力改变另一个内存位置(一个不是函数本地的变量)。

基本上,每个函数调用都是“按值调用”。但是在指针类型的情况下,我们有办法改变内存中远程地址的内容。

于 2010-12-13T09:59:23.063 回答
2

使用指针传递值 我将通过示例进行解释:

void f(int *ptr)
{
   cout<<*ptr;
}


int main ()
{
   int a=10;
   int *aptr=&a;
   f(aptr);
   return 0;
} 

这里,在 main 函数中,a 是一个整数变量,其内容为 10,地址为 00F8FB04(假设)。aptr 是指向整数的指针,存放的是整数变量a的地址,所以aptr的内容就是整数变量a的地址,即00F8FB04。当我们将 aptr 作为函数参数传递时,只有 aptr 的内容(即地址)会复制到函数参数。因此,ptr 将收到 aptr 内容的副本(即地址 00F8FB04)

于 2019-06-23T07:54:31.737 回答
0

如果您想潜在地更改指针本身,则可以使用指向指针的指针或对指针的引用。对于您最初的问题,从技术上讲,是的,所有参数都是按值传递的。

于 2010-12-13T07:06:29.293 回答
0

是的,就像在 C 中一样。

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

在这种情况下?你想要什么?您可以使用带有&修饰符的真实引用。

void func(type &ref);
于 2010-12-13T07:08:10.160 回答