是传递指针参数,还是在C++中通过值传递?因为我看到对指针的任何更改都不会反映在方法之外。不过,我通过取消引用指针所做的更改也得到了反映。
在这种情况下,使用指针到指针作为函数的参数来修改函数中的指针值,这是可接受的/标准过程吗?
发布于 2010-12-13 07:05:32
两个都是。
指针和其他指针一样,都是通过值传递的。这意味着复制指针变量的内容(指向的对象的地址)。这意味着,如果您更改函数体中指针的值,该更改将不会反映在仍然指向旧对象的外部指针中。但您可以更改指向的对象的值。
如果要将对指针所做的更改反映到外部指针(使其指向其他对象),则需要两级间接寻址(指针到指针)。当调用函数时,这是通过在指针名称前放置一个&
来完成的。这是C语言的标准工作方式。
在使用C++时,首选使用引用而不是指针(以下也称为指向指针的指针)。
关于为什么应该首选引用而不是指针,有几个原因:
在function body
非常有用
引用的缺点主要是:
在指针到指针的特定情况下,区别主要是简单的,但使用引用也可以很容易地删除两个级别的指针,并只传递一个引用而不是指针到指针。
发布于 2010-12-13 09:59:23
我理解这里的困惑。“通过值传递”和“通过引用传递”的概念看起来并不是那么清晰。请记住,计算机不知道这些概念,也不会根据这些概念进行操作。计算机不知道类型。因此,它不区分指针和值。让我试着用一个例子来解释:
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能够更改另一个内存位置(不是函数本地的变量)。
基本上,每个函数调用都是“按值调用”。但在指针类型的情况下,我们有一种方法可以更改内存中远程地址的内容。
发布于 2019-06-23 07:54:32
使用指针传递值我将通过示例来解释它:
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)
https://stackoverflow.com/questions/4426474
复制