在带有 (void*) 强制转换的字符串中打印字符的内存地址

Print memory addresses of chars in a string with (void*) cast

本文关键字:字符串 打印 字符 地址 内存 转换 void      更新时间:2023-10-16

我正在C++中尝试使用括号和指针语法,以巩固我对每种语法的理解。阅读其他 StackOverflow 问题,我知道为了打印带有std::cout的内存地址,我必须使用(void *)强制转换值。我还看到了使用std::addressof的建议。我在这个问题中的语法完全是为了学习,并不代表我对最佳实践的概念。

对于字符串"Hello, World"作为argv[1],我能够使用以下方法打印每个字符的内存位置:

for (int i = 0; argv[1][i] != ''; i++) {
std::cout << "Letter: " << argv[1][i] << " Address: " << (void*)&argv[1][i] << std::endl;
}

我希望使用此符号获得相同的结果:

for (char *c = argv[1]; *c != ''; c++) {
std::cout << "Letter: " << *c << " Address: " << (void*)&c << std::endl;
}

但是,我得到以下输出:

Letter: H Address: 0x7ffee4e05788
Letter: e Address: 0x7ffee4e05788
Letter: l Address: 0x7ffee4e05788
Letter: l Address: 0x7ffee4e05788
Letter: o Address: 0x7ffee4e05788
Letter: , Address: 0x7ffee4e05788
Letter:   Address: 0x7ffee4e05788
Letter: W Address: 0x7ffee4e05788
Letter: o Address: 0x7ffee4e05788
Letter: r Address: 0x7ffee4e05788
Letter: l Address: 0x7ffee4e05788
Letter: d Address: 0x7ffee4e05788

我的理解是...

  • c 是指向字符的指针
  • *c 是点的值
  • &c 是指针保存的内存地址
  • C++ 将 C 递增到下一个字符的内存地址

因此,我应该看到为每个字符打印一个唯一的内存地址。什么可以解释这个结果?

c是一个变量,它保存指向字符的指针(地址(;其值随每次循环迭代而变化。&c(这是您正在打印的内容(是该变量的地址;它保持不变。