函数中的局部C++指针
C++ pointers local in functions
这是我在C++中为学习目的创建的代码片段,我目前正在尝试自学。我的问题是:
为什么*ptr = 30
会更改main中最后两个cout语句的输出值?(输出为30、30、30)。因此,为什么int y = 30;
和ptr = &y;
不更改main中的输出,并保留在函数的本地?(如果我注释掉*ptr=30,而不是前两个语句,则输出为30,5,5)
如果我将函数输入更改为void printPointer(int *&fptr)
,并仅注释出*ptr = 30
,那么我的main中的*ptr
将被修改,而不是x。我理解这一点,因为pass-by-reference是在修改指针,而不是我的第一条语句如何修改main中的*ptr和x。
#include <iostream>
using namespace std;
void printPointer(int *fptr);
int main()
{
int x = 5;
int *ptr = &x;
printPointer(ptr);
cout << *ptr << endl;
cout << x << endl;
return 0;
}
void printPointer(int *fptr)
{
// int y = 30; // this does not change the output of the last two couts in main, output = 30, 5, 5
// fptr = &y;
*fptr = 30; // uncommenting this and commenting out the former two statements: output = 30, 30, 30
cout << *fptr << endl;
}
*ptr = 30
更改所指向的值。在您的案例中,您已经将ptr
设置为指向x
(当您执行ptr = &x
并将其作为参数传递给printPointer()
时)。因此x
的值发生了变化。
当您改为执行int y = 30; fptr = &y;
时,您所要做的只是将fptr
更改为指向不同的变量。就是这样。你不会改变所指向的值(即x
的值)。您不会影响ptr
,因为fptr
是一个单独的局部变量。所以ptr
仍然指向x
,而x
仍然是5。
当您修改函数以引用指针时,将fptr
更改为指向y
也会更改ptr
,因为它们是相同的变量。
*fptr = 30
将取消引用存储在fptr
中的地址,并在内存中的位置写入30。您在内存中给printPointer(ptr)
函数的这个地址。在本例中,ptr
是x的地址,您使用ptr = &x
将其分配给ptr。
int y= y
声明了函数的局部变量。fptr = &y
将y的地址分配给fptr(并覆盖ptr中的值)。因此,在这种情况下的最后一行将更改局部变量y而不是x。
如果我理解正确,您询问的是两段代码。第一个是你发布的:
#include <iostream>
using std::cout;
void f(int* fptr) {
*fptr = 30; // 11
cout << "*fptr = " << *fptr << 'n'; // 12
}
int main() {
int x = 5; // 1
int* ptr = &x; // 2
f(ptr); // 21
cout << "*ptr = " << *ptr << 'n'; // 22
cout << "x = " << x << 'n'; // 23
}
在这种情况下,指针总是指向x,在函数中,您仍然可以更改x的值,因为这就是fptr所指向的。如果有帮助的话,下面演示每行末尾的变量值:NE表示变量当前不存在。
1. x = 5, ptr = NE, fptr = NE
2. x = 5, ptr = &x, fptr = NE
11. x = 30, ptr = &x, fptr = &x
12. x = 30, ptr = &x, fptr = &x
21. x = 30, ptr = &x, fptr = NE
在那之后,值不会改变,并且所有三个语句都将打印30。
第二个是:
#include <iostream>
using std::cout;
void f(int*& fptr) {
int y = 30; // 11
fptr = &y; // 12
cout << "*fptr = " << *fptr << 'n'; // 13
}
int main() {
int x = 5; // 1
int* ptr = &x; // 2
f(ptr); // 21
cout << "*ptr = " << *ptr << 'n'; // 22
cout << "x = " << x << 'n'; // 23
}
在第一种情况下,指针是通过引用传递的,它指向y。事实上,在这种情况下,第21行涉及未定义的行为,因为y不再存在。再次,逐行分析:
1. x = 5, y = NE, ptr = NE, fptr == NE
2. x = 5, y = NE, ptr = &x, fptr == NE
11. x = 5, y = 30, ptr = &x, fptr == ptr
12. x = 5, y = 30, ptr = &y, fptr == ptr
13. x = 5, y = 30, ptr = &y, fptr == ptr
21. x = 5, y = NE, ptr = &y, fptr == NE
在此之后,值再次不变:但是,在第22行,您尝试获取ptr
的地址。正如您所看到的,*ptr = y = NE
,因此行为是未定义的。输出可以是任何内容。
(另一个注意事项是,您应该避免使用using namespace std;
,因为它可能会导致名称冲突;请使用using std::cout;
和类似的代码,如上面的代码所示。)
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错