谁能告诉这个问题打印的是啥?

Posted

技术标签:

【中文标题】谁能告诉这个问题打印的是啥?【英文标题】:Can anyone tell what is being printed in this question?谁能告诉这个问题打印的是什么? 【发布时间】:2021-06-27 10:17:17 【问题描述】:
#include <iostream>

using namespace std;
const int MAX = 4;

int main () 
const char *names[MAX] =  "Zara Ali", "Hina Ali", "Nuha Ali", "Sara Ali" ;

   for (int i = 0; i < MAX; i++) 
      cout << "Value of names[" << i << "] = ";
      cout << (names + i) << endl;
   

return 0;

上面代码中的 (names + i) 打印是什么

什么是字符*名称

【问题讨论】:

你对它们有什么猜测吗? 您是否尝试过逐步浏览代码? 【参考方案1】:

names 是一个 const char * 指针数组,它们被初始化为指向内存中的字符串字面量(与显示的代码无关)。

当一个数组仅由其名称引用时,它衰减为指向第一个元素的指针。然后循环使用 指针算法 来增加该指针以访问每个后续元素。因此,表达式names + i 实际上与&amp;names[i] 相同,因此循环打印出数组中每个元素的内存地址,例如:

Value of names[0] = 0x7ffedc2f1850
Value of names[1] = 0x7ffedc2f1858
Value of names[2] = 0x7ffedc2f1860
Value of names[3] = 0x7ffedc2f1868

Online Demo

如果代码使用*(names + i) 代替,那么它将取消引用这些地址,从而打印出数组中的每个const char* 指针。 operator&lt;&lt; 被重载以将 const char* 处理为以 null 结尾的字符串,因此将打印字符串文字的内容而不是它们的地址,例如:

Value of names[0] = Zara Ali
Value of names[1] = Hina Ali
Value of names[2] = Nuha Ali
Value of names[3] = Sara Ali

Online Demo

【讨论】:

这是不正确的。如果正在打印*(names + i),您所描述的将是正确的。星号不见了。 names + i 是指向指针的指针,而不是指向字符串第一个字符的指针。 @Peter 你是对的,我没有看到丢失的取消引用。我已经确定了答案。

以上是关于谁能告诉这个问题打印的是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何打印出这个 RestAction / List

谁能告诉我android studio中的这个错误是啥[关闭]

Unicode 可打印字符的范围是多少?

谁能告诉我在 ios 应用程序中录音的最佳录音功能是啥

有关电脑的,下面的符号是啥?

有用过lodop插件打印呢的吗?