如何以及何时复制指针
How and when is copy of pointer made
在下面的代码中,输出是20,并解释说在fun()
内部,q
是指针p
的副本。因此,如果我们更改q
以指向其他内容,那么p
不会受到影响。函数复制指针的机制是什么?为什么p
在存储q
地址时不打印 10 .
void fun(int *p)
{
static int q = 10;
p = &q;
}
int main()
{
int r = 20;
int *p = &r;
fun(p);
printf("%d", *p);
getchar();
return 0;
}
因为该函数fun
按值传递参数。如果要在函数外部修改变量,则需要指针。由于要在函数外部修改int *
指针,因此需要一个int **
指针:
void fun(int **p) //here
{
static int q = 10;
*p = &q;
}
int main()
{
int r = 20;
int *p = &r;
fun(&p); //and here
printf("%d", *p);
return 0;
}
在C++中,您可以以类似的方式使用按引用传递。
如果我们改变q指向其他东西" - q不指向,它不是一个指针。它是一个整数。如果您的意思是"如果我们更改 q 的值",例如
q = 12
然后发生了两件事。
- p没有改变,因为它仍然指向q的位置(它是一个地址)
*p 确实会从 10 更改为 12,因为 *p 表示"值在"
最后"为什么p不打印10"
主函数中的 p 与"有趣"函数中的 p 不同。 它们以相同的值开始,因为你传递它(fun(p)),但是当你改变它(p = &q)时,你是在改变fun中的p,而不是main中的p。 所以 p 仍然指向 &r(不是 &q),所以 *p 是 20
解释在 fun() 中,q 是指针 p 的副本
不。fun
中的p
是主p
的副本。
因此,如果我们更改 q 以指向其他内容
q
不是指针。你不能让它指向别的东西,或者根本不能指向任何东西。
函数复制指针的机制是什么?
函数调用中的参数:
fun(p); // this p here
复制到函数定义中的参数:
void fun(int *p) // this p here
为什么 p 在存储 q 的地址时不打印 10。
因为p
不存储q
的地址。至少,不是主要的p
,谁是你正在打印的取消引用值。只有 fun
中的p
指向q
.但这是函数的局部变量,你没有对它做任何事情。
有两个不同的变量,都称为p
。
其中一个在 main()
中声明,另一个在 fun()
中声明(参数列表中声明的变量是函数的局部变量)。它们不会冲突,因为它们是不同函数中的局部变量,但它看起来确实令人困惑。
请注意,如果fun()
中的引用被称为pp
而不是p
,则会生成相同的代码,但您不会将它们视为相同的变量。
- 复制构造函数C++无法正确复制指针
- 如何在C++中复制指针数组的数据
- 如何编写复制构造函数来复制指针?
- 是否可以在不显式迭代每个元素的情况下深度复制指针容器?
- 复制指针,在不更改原始指针的情况下更改副本指向的内容?
- C++如何正确复制指针的容器(向量)
- 复制指针,然后调用 delete
- 是否应始终为具有原始指针成员的类中的深层复制指针定义复制构造函数
- C++复制指针
- 复制指针向量而不切片
- 如何以及何时复制指针
- 删除指向不同指针类型的复制指针是否会导致内存泄漏
- 复制指针值c++
- c++深度复制指针到带有指针值的映射
- 复制指针数组中动态创建的指针
- 如何复制指针到不完整类型- c++
- 复制指针类
- 模板中的内存分配指针和复制指针
- 写时复制指针对象
- 如何处理复制指针的释放