游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4063|回复: 10

[疑问!] char* szStr = "Cheng Xu Yuan" ; 中,szStr

[复制链接]

18

主题

47

帖子

47

积分

注册会员

Rank: 2

积分
47
发表于 2006-1-25 08:33:00 | 显示全部楼层 |阅读模式


char* szStr = “Cheng Xu Yuan” 这是字符串在函数参数和其他读取文件时最常用的字符串操作方式。

我一直有一点点疑惑 szStr 是一个字符型指针,是一个内存地址,怎么可以直接用等号和一个字符串常量赋值呢?相当于        内存地址 = 字符串常量 ????????????

如果这样的话,为什么 int* iNum = 78965;这个表达式就肯定不对了呢?不都是一样的吗?难道C++对字符型格外的偏爱?


cout<<szStr  显示的也不一个是内存地址而是赋值的那个字符串;Why????
cout<<iNum 显示的就是0067E8D这样的内存地址。  


请各位前辈高手指教。



64

主题

855

帖子

856

积分

高级会员

Rank: 4

积分
856
QQ
发表于 2006-1-25 09:50:00 | 显示全部楼层

Re:[疑问!] char* szStr = "Cheng Xu Yuan" ; 中,szStr是内

char* szStr = "Cheng Xu Yuan"  // szStr = "Cheng Xu Yuan"的地址

44

主题

248

帖子

274

积分

中级会员

Rank: 3Rank: 3

积分
274
发表于 2006-1-25 13:01:00 | 显示全部楼层

Re:[疑问!] char* szStr = "Cheng Xu Yuan" ; 中,szStr是内

char* szStr = "Cheng Xu Yuan"  这里是一个字符串常量,字符串是一块连续的内存,c++确实对于他特殊处理,在程序初始化之前会在数据段分配一块地指给他,

int* iNum = 78965  他就不一样,内建型别,直接用mov就赴值了。

再不明白的话自己用gcc编译器输出的汇编代码看看就明白了

36

主题

1047

帖子

1147

积分

金牌会员

Rank: 6Rank: 6

积分
1147
发表于 2006-1-25 15:08:00 | 显示全部楼层

Re:[疑问!] char* szStr = "Cheng Xu Yuan" ; 中,szStr是内

char* szStr = "Cheng Xu Yuan"
字符串是保存在数据段中,szStr只是一个指向这个数据的地址而已
int* iNum = 78965
从语法上来说也是正确的,相当于你给一个整形指针赋值地址。
至于cout,你看看它的源代码实现,它重载了<<操作符,对于不同的类型有不同的处理,这并不是c++内部机制。

7

主题

299

帖子

305

积分

中级会员

Rank: 3Rank: 3

积分
305
发表于 2006-1-25 16:10:00 | 显示全部楼层

Re:[疑问!] char* szStr = "Cheng Xu Yuan" ; 中,szSt

c语言的教科书有很详细的关于这种关于字符串指针赋值语法的解释

可以翻翻谭浩强的书

另外c语言应该说没有字符串常量只有字符常量或者字符串数组

“Cheng Xu Yuan”表示的是这个字符串数组的首地址

20

主题

398

帖子

398

积分

中级会员

Rank: 3Rank: 3

积分
398
发表于 2006-1-25 18:38:00 | 显示全部楼层

Re:[疑问!] char* szStr = "Cheng Xu Yuan" ; 中,szStr是内

应该是C++对字符的管理做了特殊处理

7

主题

67

帖子

69

积分

注册会员

Rank: 2

积分
69
发表于 2006-1-26 01:27:00 | 显示全部楼层

Re:[疑问!] char* szStr = "Cheng Xu Yuan" ; 中,szSt

你应该这么理解,C/C++中根本不存在字符串,
你看到的“Cheng Xu Yuan” 这种形式,仅仅是是一个字符数组而已。

char* szStr = "Cheng Xu Yuan"

szStr仅仅是一个数组的首址指针。


另外,更正一下5楼的,"Cheng Xu Yuan" 不是一个字符串数组,
而是一个字符数组!

只要牢记~真正编程的语言里,没有字符串的存在,有的仅仅是字节数据。

字符串只不过是用N多的字节模拟出来的。

0

主题

275

帖子

676

积分

高级会员

Rank: 4

积分
676
发表于 2006-1-26 09:39:00 | 显示全部楼层

Re:[疑问!] char* szStr = "Cheng Xu Yuan" ; 中,szSt

char* szStr = “Cheng Xu Yuan”;

//同?
char *strStr;
char name[]=“Cheng Xu Yuan”;

strStr=&name[0];
strStr=name;
所以??器是指派name的位址?strStr...
因?榫??器可以?定???位址合法型?e一致...

int *iNum =( int )78965;
???型?e不一致
你可以??制?型
int *iNum =( int *)78965;


iNum=(int *)name;
不?????法很危?..程式????要知道自己?质颤N=.=a
  



248

主题

2674

帖子

2702

积分

金牌会员

Rank: 6Rank: 6

积分
2702
QQ
发表于 2006-1-26 16:19:00 | 显示全部楼层

Re:[疑问!] char* szStr = "Cheng Xu Yuan" ; 中,szStr是内



我的理解是:

char *str ;// 这个是一个char 指针。这是一种基本的理解,但是c语言里面还有一种理解,就是根据他的用途来扩展的一个意义。叫字符串。 字符串和char指针的不同在于,字符串是一个人为的使用规范,它规定了str 所指向的地址为开始地址, 直到遇到值为 '\0'的地址结束,这段地址都是合法的。

但是这个人为的规范很简陋,因为它不能区分到底char *str是遵照这个规范的字符串,还是他的基本语意,char指针。这往往容易出现问题。

str = "hello"; //这个赋值操作,并非是将 'h' 赋值给str.
char s = 'h'; char *ps = &s; -->可见  char *ps = 'h'; 是错误的,而ps = &'h';才是正确的类型赋值。

因而, str = "hello";这里的"hello"的值不是hello的字符编码,而是他的地址值。这和字符文本是不同的。

对于cout 的显示问题,楼主有点混乱。

cout是一个函数,它可以对他的输入参数做任何可能的操作,一个指针,他有必要一定要取他的值吗?那样有什么意义,他不能去指针指向的数据吗?就好像:

int i = 100;
int *pi = &i;
打印 pi ; //指针的值往往没有意义。
打印 *pi;  //取指针指向的数据,这可是指针的基本操作啊。

要打印一个字符串:

for (int i =0; *str != '\0"; str++) //str++指向下一个字符的地址
{
    char c = *str;
    printf( "%c", c);
}

只需按照他的规范,也就是以'\0'为结尾的连续地址空间。

不过cout是如何判断它是一个字符串,而不是一个字符指针,还真不清楚。




248

主题

2674

帖子

2702

积分

金牌会员

Rank: 6Rank: 6

积分
2702
QQ
发表于 2006-1-26 16:31:00 | 显示全部楼层

Re:[疑问!] char* szStr = "Cheng Xu Yuan" ; 中,szStr是内

我怀疑编译器对字符串采取两种赋值态度。

一种是当他是赋值给指针的,这时候字符串是他的地址。
一种是当他给普通变量赋值时, 他的值是他的内容。

如:
char *ps = "hello";  // ps == 地址值
char s = "hello" ; // s == 'h' 的编码, 而不是地址值的裁减

估计~大家可以验证一下,我的电脑太慢了~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-23 08:01

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表