新手对于char*的一点疑问

none2001 2009-06-19 08:17:01
Const Char* st="The expense of spirit\n";

1.如上指针中,st是地址么,怎么说st="The expense of spirit\n"
st++怎么理解?
*st++怎么理解? 先st++再解除引用么?

2.Char指针与Int指针不一样么?
Int pd;
Int* pv=&pd;

pv为pd的地址,pv<>pd, 那为什么st="The expense of spirit\n"
怎么区别这两个指针?

自己理解可能有错误, 请各位高手解惑.谢谢.
...全文
98 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
cismylife 2009-06-19
  • 打赏
  • 举报
回复
楼上正解
飞天御剑流 2009-06-19
  • 打赏
  • 举报
回复
Const Char* st="The expense of spirit\n";

1.如上指针中,st是地址么,怎么说st="The expense of spirit\n"
st++怎么理解?
*st++怎么理解? 先st++再解除引用么?
-----------------------------------------
st不是地址,是保存地址的变量,其值是地址。字符串在c/c++中其实是一个地址,编译器在编译时会用此字符串在静态存储区中的地址替换它,因此

st="The expense of spirit\n" 是把该字符串的地址赋予st,让st指向该字符串。

st++就是st的值自加一,运算后st指向上述字符串第一个单词The中的h。

对于*st++,由于后增量的优先级比间接运算符*高,因此st属于++的操作数,又由于这里的++是后增量,st先应用,因此先对st指向的char类型数据取值,然后st自加一



2.Char指针与Int指针不一样么?
Int pd;
Int* pv=&pd;

pv为pd的地址,pv <>pd, 那为什么st="The expense of spirit\n"
怎么区别这两个指针?
-----------------------------------------------------
不可理解为“pv为pd的地址”,这种理解有偏差的,应理解为pv保存了pd的地址。对于指针来说,它保存的是对象的地址,那么只要赋予它一个合法对象的地址,都是可以的,就象pv = &pd是把一个int对象的地址赋予pv,而st="The expense of spirit\n"是把一个char对象的地址赋予st一样。st与pv两者的区别就是所指向的对象的类型不同。
飞天御剑流 2009-06-19
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 lixing01 的回复:]
引用 8 楼 supermegaboy 的回复:
又来"st为地址",不要这样说,别小看这些细节,会影响到对数组与指针的理解的。


也是初学c++, 请教一下如果不说st是地址那么应该如何表达更加合理,我的理解:st肯定是包含了内存地址的,但同时也包含了该地址存储的数据类型的信息。
[/Quote]


准确地说,是st的值为地址。但你的理解“st肯定是包含了内存地址的,但同时也包含了该地址存储的数据类型的信息”是对的。只是不要说st为地址这种话。

什么什么为地址意味着在表达式中这是个右值,但st作为一个指针对象,是一个左值。
lixing01 2009-06-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 supermegaboy 的回复:]
又来"st为地址",不要这样说,别小看这些细节,会影响到对数组与指针的理解的。[/Quote]

也是初学c++, 请教一下如果不说st是地址那么应该如何表达更加合理,我的理解:st肯定是包含了内存地址的,但同时也包含了该地址存储的数据类型的信息。
飞天御剑流 2009-06-19
  • 打赏
  • 举报
回复
又来"st为地址",不要这样说,别小看这些细节,会影响到对数组与指针的理解的。

,*st为字符串中其中一个char. 此时字符串被看做一个数组.st++则st指向下一个char的地址.*st的值为此时指向的那个char.
----------------------------------------------------------------------------------------------------
对。在c/c++看来,字符串常量不仅仅“被看做”,而是就是一个数组,你可以这样使用它:"The expense of spirit\n"[2],此表达式

值为字符e。



迷惑的就是:"The expense of spirit\n"是一个地址. st++后 "expense of spirit\n"也是一个地址么.这两个地址在内存中怎么存在的.有包含关系么?
-----------------------------------------------------------------------------------------------------------------
一个字符串常量除空串外的任何一个子串都是一个地址,这个地址并没有作为一个对象存在于内存中,但它可以作为一个值保存在一个对象中,例如赋予了某个

指针。字符串常量是一个右值。

lixing01 2009-06-19
  • 打赏
  • 举报
回复
st++ // 指针+1
*st++ // 指针1, 然后解除引用(同一个名称有多个操作符,则先左后右处理),所以该表达式的结果是:指向第二个字符‘h’的char指针

错误修改:

*st++ // 同一个名称有多个操作符,则先左后右处理,++放在名称后面,其值是在语句完成后才改变,所以该表达式的结果是:指向第1个字符‘T’的char指针 ,然后st+1,即指向了第二个字符'h'
lixing01 2009-06-19
  • 打赏
  • 举报
回复
[Quote=引用楼主 none2001 的帖子:]
Const Char* st="The expense of spirit\n";

1.如上指针中,st是地址么,怎么说st="The expense of spirit\n"
st++怎么理解?
*st++怎么理解? 先st++再解除引用么?

2.Char指针与Int指针不一样么?
Int pd;
Int* pv=&pd;

pv为pd的地址,pv <>pd, 那为什么st="The expense of spirit\n"
怎么区别这两个指针?

自己理解可能有错误, 请各位高手解惑.谢谢.
[/Quote]

1.
留意一下语句的性质:
Const Char* st="The expense of spirit\n"; // 这是一个声明语句,同时完成了初始化,所以可以这么表达。左边申明了一个const的char指针,右边是一个字符串常量其值实际上就是一个char指针(指向字符串首字符的地址)。const必须在声明的时候初始化

char * st; // 仅仅声明,不初始化
*st = "The expense of spirit\n"; // 赋值语句,完成赋值,注意修改是值不是地址
char ch1;
st = &ch1; // 赋值语句,这儿修改的是地址,不是内存地址指向的值

st++ // 指针+1
*st++ // 指针1, 然后解除引用(同一个名称有多个操作符,则先左后右处理),所以该表达式的结果是:指向第二个字符‘h’的char指针




2.Char指针与Int指针不一样么?
Int pd;
Int* pv=&pd;

pv为pd的地址,pv <>pd, 那为什么st="The expense of spirit\n"
怎么区别这两个指针?

st="The expense of spirit\n" // 错误, 左边是指针的地址(内存地址),右边是一个char指针(实际上表示的是首个字符'T')
你混淆的地方在于:声明语句中*除了表明声明的是一个指针外,如果同时进行初始化,则*不能忽略,即Const Char* st="The expense of spirit\n"; 中左边是一个char指针指向的值,而不是st(内存地址)。


注意理解:声明语句,赋值语句,以及初始化的概念
song_0521 2009-06-19
  • 打赏
  • 举报
回复
我也来学习学习
none2001 2009-06-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 supermegaboy 的回复:]
Const Char* st="The expense of spirit\n";

1.如上指针中,st是地址么,怎么说st="The expense of spirit\n"
st++怎么理解?
*st++怎么理解? 先st++再解除引用么?
-----------------------------------------
st不是地址,是保存地址的变量,其值是地址。字符串在c/c++中其实是一个地址,编译器在编译时会用此字符串在静态存储区中的地址替换它,因此

st="The expense of spirit\n" 是把该字符串的地址赋予st,让s…
[/Quote]

谢谢,再请问下

Const Char* st="The expense of spirit\n";
"The expense of spirit\n"即是一个地址,又是字符串
st="The expense of spirit\n" st初始化为上述地址,st依然是变量可以指向其他地址.
//下面应该正确吧
st="expensive\n"

下面理解是否正确,谢谢.
st为地址,*st为字符串中其中一个char. 此时字符串被看做一个数组.st++则st指向下一个char的地址.*st的值为此时指向的那个char.

迷惑的就是:"The expense of spirit\n"是一个地址. st++后 "expense of spirit\n"也是一个地址么.这两个地址在内存中怎么存在的.有包含关系么?



none2001 2009-06-19
  • 打赏
  • 举报
回复
谢谢.

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧