c++ - char指针不递增?

标签 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$ 

最佳答案

您正在递增指针,但输出保存指针本身的变量的地址 ( &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 - 每次运行都会得到不同的输出,因为内核会将可执行文件加载到内存中的不同位置。


编辑:是的,这个答案的第一个版本,关于简单输出 ptrstd::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/

相关文章:

c++ - g++ 的 liblastfm 编译错误

c++ - 如何制作可滚动但不显示滚动条的单行 systabcontrol32

c++ - 使用比较函数定义哈希集

c++ - 为什么这个循环模板实例化是合法的?

c - 在c中与硬件交互

c - C 中的函数指针和回调

c++ - std::make_array 的目的是什么? C++20 中还需要它吗?

c++ - int(*a)的解释[3]

c - C中数组中指针变量的减法?

c - *ptr++ 对下一个内存位置有副作用吗?