字符指针不增加?

时间:2019-11-30 14:58:47

标签: c++ pointers

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$ 

2 个答案:

答案 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'之后是垃圾,您可以理解并指出这种未处理的内存位置不好。