C++ 指针 - 函数调用中的重新分配
C++ Pointer - ressignment in a function call
我最近在查看Google的C++材料,并遇到了以下用于演示指针的代码
void Unknown(int *p, int num);
void HardToFollow(int *p, int q, int *num);
void Unknown(int *p, int num) {
int *q;
q = #
*p = *q + 2;
num = 7;
}
void HardToFollow(int *p, int q, int *num) {
*p = q + *num;
*num = q;
num = p;
p = &q;
Unknown(num, *p);
}
main() {
int *q;
int trouble[3];
trouble[0] = 1;
q = &trouble[1];
*q = 2;
trouble[2] = 3;
HardToFollow(q, trouble[0], &trouble[2]);
Unknown(&trouble[0], *q);
cout << *q << " " << trouble[0] << " " << trouble[2];
}
我的问题如下:q 指针最初被分配给 trouble[1]。当发送到 HardToFollow 时,q 指针(现在称为 p(会更新为值 4,麻烦 [1] 也会随之更新。紧接着,原始 q 指针(在此函数中再次称为 p(被重定向到指向局部变量 (p = &q(。尽管如此,在程序结束时,我们原来的 q 指针又回到了指向麻烦[1]。这是怎么发生的?
您不能简单地通过按值传递main::q
将其传递给函数来修改HardToFollow
。 由于您的q
作为按值传递传递给它,因此在HardToFollow
中,您可以修改q
通过p
和p
本身所指向的内容,但您无法修改q
指向其他内容。
稍微修改示例将执行您所期望的操作:
void HardToFollow(int*& p, int q, int *num) {
*p = q + *num;
*num = q;
num = p;
p = &q;
//Unknown(num, *p); //forget about this for now
}
我添加了一些评论,清楚地表明:
void HardToFollow(int *p, int q, int *num) {
/* this modifies the value pointed to by p */
*p = q + *num;
*num = q;
num = p;
/* this does not modify the original pointer */
p = &q;
Unknown(num, *p);
}
[...]
/* the memory address q points to is copied to the function scope */
HardToFollow(q, trouble[0], &trouble[2]);
因为在函数 未知 中不使用主函数
中的指针 q该函数仅适用于名为 num 的指针的值
相关文章:
- C++ 如何在将新对象分配给另一个对象时创建新对象
- 如何增加以前由新运算符分配的 C++ std::list 数组的大小?
- 为模板参数类型中的新对象分配内存
- 新运算符分配的大小大于声明的大小.为什么
- 在C++中分配分配
- 为什么支撑初始化分配分配填充垃圾变量
- C 新操作员分配新内存
- 新不分配内存?
- 如果我的C++“新”内存分配失败,如何找出返回值
- 我可以用新的分配内存块吗?
- COM / DCOM:服务器存根不会为现有接口中的新方法分配内存
- 在线程在 C++ 中完成后将新任务分配给线程
- 只能使用CUDA中的新运算符分配有限的内存
- 与将新内容分配给向量的指针斗争
- 确定C++中新运算符分配的内存大小
- 按新内存分配
- 是否有必要使用 'new' 将新指针分配给与指向同一结构的先前存在的指针相同的结构?如果是这样,为什么?
- 用于新运算符分配的公共内存
- boost::io_service post方法是否引起新的分配?
- 如何在C++中检索由新运算符分配的对象的地址