2 mengxiang tianji mengxiang_tianji 于 2016.04.02 11:33 提问

字符串数组相关问题,正文有描述
1.char *str[] = { "Welcome", "to", "Fortemedia", "Nanjing" };
2.char **p = str + 1;
3.str[0] = (*p++)+2;
4.cout << str[0] << endl;
5.str[0] += 1 ;
6.cout << str[0] << endl;
7.str[0] += 1;
8.cout << str[0] << endl;

在VS2013中运行结果如下:

(空)
(空)
Fortemedia
请按任意键继续. . .

第三行str[0]指向o后面的'\0',输出为空,但是将指针加1后输出为什么还是空?再次加1才指向下一个字符串首地址。

2个回答

cxsmarkchan
cxsmarkchan   2016.04.02 12:09
已采纳

你认为这些字符串在内存中的存放格式如下:"Welcome\0to\0Fortemedia\0Nanjing\0"

这个想法并不正确,这些字符串仅仅是被存放在了一块叫做“常量区”的地方,但C++没有要求它们首尾相连。所以,to后面并不一定紧跟Fortemedia,这和编译器有关。

彩蛋:

char *str[] = {"Welcome", "to", "Welcome", "Nanjing"};

把str的定义改成这样,输出的时候也许会有惊喜……(编译器会把两个Welcome放到同一个地址)

mengxiang_tianji
mengxiang_tianji 回复cxsmarkchan: 好的
一年多之前 回复
cxsmarkchan
cxsmarkchan 回复mengxiang_tianji: 个人建议少用这种复杂的指针运算,尤其是从一个字符串跳到另一个字符串,因为这要求你对程序数据在内存中的存放方式非常了解。一般来说我们用数组/字符串指针,都是局限在这个数组/字符串内部。
一年多之前 回复
mengxiang_tianji
mengxiang_tianji 谢谢谢谢
一年多之前 回复
zanfeng
zanfeng   2016.04.02 11:58

void Test()
{
char *str[] = { "Welcome", "to", "Fortemedia", "Nanjing" };

cout << str[0] << endl;

cout << str[1] << endl;

cout << str[2] << endl;

cout << str[3] << endl;
}

mengxiang_tianji
mengxiang_tianji 什么意思?
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!