谁能告诉这个问题打印的是啥?
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
实际上与&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<<
被重载以将 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 你是对的,我没有看到丢失的取消引用。我已经确定了答案。以上是关于谁能告诉这个问题打印的是啥?的主要内容,如果未能解决你的问题,请参考以下文章