[关闭]
@CrazyHenry 2018-02-01T11:16:00.000000Z 字数 1075 阅读 1079

6.x 关于二维char数组与字符串字面量

ccccC++Primer


C++中,标准IO库定义了,输出一个字符型指针,就会将该指针所指以及连续内存中所有的字符输出,直到遇到'\0'
同时,在string标准库中还重载了<<运算符,输出string的对象,就会输出string对象存放的字符串。所以在使用string对象的时候,无需思考底层的char*指针!

  1. char ch = 'h';
  2. char *g = &ch;
  3. cout<<g<<endl;//输出char*型指针,可能崩溃!

image.png-8.8kB

但是如果输出指向char *类型的指针呢?
答案是会正常输出指针!
具体分析见:

  1. const char *p[] = {"Hello","jhafjd"};
  2. //等价于const char *(p[2]) = {"Hello","jhafjd"};
  3. //p会转换为指针,指向const char*类型
  4. cout<<p[1]<<endl;//输出jhafjd
  5. cout<<p<<endl;//输出地址0x6ffe30

image.png-9.5kB

  1. char d[][8] = {"Hello","kjhd"};
  2. //d会转换为char (*)[8]类型的指针
  3. //*d是char[8]类型的数组,因此会转换为char*类型的指针
  4. cout<<*d<<endl;//输出Hello,等价于d[0]
  5. cout<<*(d+1)<<d[1]<<endl;//输出kjhd,等价于d[1]
  6. const char *p[] = {"Hello","jhafjd"};
  7. //等价于const char *p[2] = {"Hello","jhafjd"};
  8. //p会转换为指针,指向const char*类型,即p的类型是
  9. //const char**
  10. //注意,这里的存储方式和上面的d不一样,p是一个数组,存了两个地址,数组只占连续的两块内存,但是两个地址是零散的。即,字面量"Hello"和"jhafjd"是两块不同的内存!
  11. //d是数组的数组,而且它的两个字符串是存在连续的内存空间的,只不过都有"空隙",因为每个字面量都是char [8]类型的数组!
  12. cout<<p[1]<<endl;//输出jhafjd
  13. char (*pp)[8] = d;//因为d会被转换为char (*)[8]类型
  14. //所以可以给pp初始化
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注