使用(void*)强制转换以字符串形式打印字符的内存地址 我正在用C++中的括号和指针语法来巩固我对每一个的理解。在阅读其他StackOverflow问题时,我意识到为了使用std::cout打印内存地址,我必须使用(void*)强制转换该值。我还看到了使用std::addressof的建议。我在这个问题上的语法完全是为了学习,而不是代表我对最佳实践的概念

使用(void*)强制转换以字符串形式打印字符的内存地址 我正在用C++中的括号和指针语法来巩固我对每一个的理解。在阅读其他StackOverflow问题时,我意识到为了使用std::cout打印内存地址,我必须使用(void*)强制转换该值。我还看到了使用std::addressof的建议。我在这个问题上的语法完全是为了学习,而不是代表我对最佳实践的概念,c++,pointers,memory,C++,Pointers,Memory,对于字符串“Hello,World”,如argv[1],我可以使用以下命令打印每个字符的内存位置: for (int i = 0; argv[1][i] != '\0'; i++) { std::cout << "Letter: " << argv[1][i] << " Address: " << (void*)&argv[1][i] << std::endl; } 我的理解是 c是指向字符的指针 *c是指针

对于字符串“Hello,World”,如
argv[1]
,我可以使用以下命令打印每个字符的内存位置:

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

  • c是指向字符的指针
  • *c是指针对象的值
  • &c是指针持有的内存地址
  • c++将c递增到下一个字符的内存地址

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

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

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

Aha,所以我应该使用(void*)和(*c)省略符号andaha,所以我应该使用(void*)和(*c)省略符号andaha
for (char *c = argv[1]; *c != '\0'; 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