ptr++
后指针不递增
1 #include<iostream>
2
3 int main() {
4
5 char *ptr;
6 char ch = 'A';
7 ptr = &ch;
8
9 std::cout << "pointer :" << &ptr << "\n";
10 ptr++;
11 std::cout << "pointer after ++ :" << &ptr << "\n";
12 return 0;
13 }
ikar$ g++ pointer_arth.cpp
ikar$ ./a.out
pointer :0x7ffeed9f19a0
pointer after ++ :0x7ffeed9f19a0
ikar$
最佳答案
您正在递增指针,但输出保存指针本身的变量的地址 ( &ptr
)。你应该只输出 ptr
(并相应地格式化 - 请参阅下面的编辑)。
例子:
#include <iostream>
int main() {
char data;
char *ptr = &data;
std::cout << "pointer:" << (unsigned long long)ptr << std::endl;
ptr++;
std::cout << "pointer incremented: " << (unsigned long long)ptr << std::endl;
}
输出:
pointer:140732831185615
pointer incremented: 140732831185616
是的,只打印 ptr
将输出垃圾,所以我将指针转换为整数(因为指针无论如何都是内存地址)。
正如评论中所建议的,您可以将指针指向 void *
打印时,这提供了更好的格式:
pointer:0x7ffee5467acf
pointer incremented: 0x7ffee5467ad0
注意如何 0x7ffee5467acf == 140732745022159 != 140732831185615
- 每次运行都会得到不同的输出,因为内核会将可执行文件加载到内存中的不同位置。
编辑:是的,这个答案的第一个版本,关于简单输出 ptr
与 std::cout << ptr
, 是不正确的,因为 <<
运算符以这样的方式重载 treats pointers to char
as C-strings .因此,该版本将访问可能无效的内存并输出垃圾。
但概念保持不变。指向 int
的指针,例如,没有这个“问题”并且被打印为十六进制数字,即使没有将它们转换为 void *
: Try it online! .输出显示指针仍然正确递增 sizeof(int)
,在该机器上等于 4。
关于c++ - char指针不递增?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59117323/