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$
答案 0 :(得分:3)
您正在增加指针,但输出保存指针本身的变量的地址(&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
,是不正确的,因为<<
运算符以{{ 3}}。因此,该版本将访问可能无效的内存并输出垃圾。
但是这个概念保持不变。例如,指向int
的指针没有此“问题”,并且以十六进制数字打印,即使没有将其强制转换为void *
:treats pointers to char
as C-strings。输出显示指针仍然正确地以sizeof(int)
递增,在该机器上等于4。
答案 1 :(得分:1)
指针在您的代码中成功增加。 您打印保存指针变量的位置地址。 实际上,如果输出'ptr',则在字符-'A'之后是垃圾,您可以理解并指出这种未处理的内存位置不好。