字符指针不递增?

char pointer doesn't increment?

本文关键字:指针 字符      更新时间:2023-10-16

在指针不递增之后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- 每次运行时都会获得不同的输出,因为内核会将可执行文件加载到内存中的不同位置。


编辑:是的,这个答案的第一个版本,关于简单地用std::cout << ptr输出ptr,是不正确的,因为<<运算符重载的方式是它将指向char的指针视为 C 字符串。因此,该版本将访问可能无效的内存和输出垃圾。

但概念保持不变。指向int的指针 ,例如,没有这个"问题",即使没有将它们转换为void *也打印为十六进制数字:在线尝试!输出显示指针仍然正确递增sizeof(int),等于该计算机上的 4。

指针在代码中成功递增。 打印保存指针变量的位置地址。 实际上,如果打印"ptr",则字符-"A"之后是垃圾,您可以理解并指向这种未处理的内存位置不好。