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

时间:2010-12-13 07:03:10

标签: c++ function pointers pass-by-value

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

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

5 个答案:

答案 0 :(得分:33)

两者都是。

指针按值传递。这意味着复制了指针变量的内容(指向的对象的地址)。这意味着如果更改函数体中指针的值,则该更改将不会反映在仍将指向旧对象的外部指针中。但是你可以改变指向的对象的值。

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

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

对于为什么引用应该优先于指针,有几个原因:

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

引用的缺点主要是:

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

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

答案 1 :(得分:8)

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

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

void func2(int *x)
{
   int a;
   x = &a;
}

两个函数中的机器操作相同:它获取参数并更改它。 请注意,在第二个函数中,它不会修改* 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. 

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

如果我们将func2写成

void func2(int *x)
{ 
   *x = 5; 
}

然后,这将是“通过引用呼叫”的真实案例。

答案 2 :(得分:0)

如果您希望可能更改指针本身,则可以使用指针指针或指针引用。对于您的原始问题,从技术上讲,是的,所有参数都按值传递。

答案 3 :(得分:0)

是的,就像它在C中一样。

  

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

在哪种情况下?你想要什么?您可以将实际引用与&修饰符一起使用。

void func(type &ref);

答案 4 :(得分:0)

  

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

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


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

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