鱼C论坛

 找回密码
 立即注册
查看: 2864|回复: 6

字符串指针的理解

[复制链接]
发表于 2014-7-2 01:12:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
初学指针,看谭浩强老师的书上写
char* string="i love china"
等价于下面两行
char* string;
string="i love china"

感到不太能理解,为什么指针变量string可以等于一个字符串? 如果string="i love china"的话,它不是应该是一个字符串吗?为什么又是指针变量?


如何去理解?

而且当我用 strlen函数的时候,用的是strlen(string),既然string是个指针变量,为什么不是用strlen(*string)呢?

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-2 04:46:39 | 显示全部楼层
你输出string 与输出*string看看结果是否一样……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-2 07:59:00 | 显示全部楼层
本帖最后由 santaclaus 于 2014-7-2 08:13 编辑

关于第1问:这涉及到编译器的行为了,
char* string="i love china"  //当编译器发现字符串"i love china"时,就在内存的常量区中开辟一块内存来存放这些字符,并把这块内存的首地址,交给了string指针。因此,string指向的那块内存。又因string是char* 类型的,就告诉程序以后访问那个字符串时是以一个个字符方式去访问。而且字符串是不能赋值给char或char*类型的,所以你说的那情况是不存在的。

第2问:strlen是一个函数。我们都知道,给函数传参时,可以传值、传地址、传引用等3种方式进行传递。你给的strlen(*string)是希望按值传递,调用函数时,得把"i love china"在内存中再拷贝一次,理论上可行,但效率太低。strlen采取的是传地址方式,无须再次拷贝那串字符,效率一般要高很多。所以strlen也就舍弃了你说的那种方式。



                              
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-2 09:58:55 | 显示全部楼层
定义一个指针这个指针指向这个字符串的地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-2 13:19:15 | 显示全部楼层
char* string="i love china"
等价于下面两行
char* string;
string="i love china"

两者不等价,下面这种写法不可取,必须注意
string =  应该是个char*的指针

看下这里的第三课,有好处
http://chinasvn.xicp.net/
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-2 19:35:37 | 显示全部楼层
本帖最后由 折心灬小轩 于 2014-7-2 19:38 编辑

1.string是个指针,那么它指向的自然是一个地址,“i love china”是个常字符串,它是存储在静态区的一块内存的集合,这个集合是顺序的,即存储单元的编号是相连的,那么在string=“i love china”时,编译器用这个内存集合的首个存储单元的地址(也有可能是首个存储单元的首字节,这是特殊情况,不做过多处理)为指针赋值,也就是等于string=&'i';(如果这个语法可行的话,这里只是为了方便说明,不要纠结),这样就很好理解字符串指针了。最后总结一句,字符串用习惯就会了。

2.
我自己写的strlen为:
int strlen(const char *head)
{
        int num=0;
        for(const char *pre=head;*pre!='\0';num++,pre++);
        return num;
}
这样的话,你应该懂得这样一个规则,不管是什么变量还是常量,只要作为参数传入strlen函数,都会被编译器把它解释成一个常量(地址),从这个地址一直开始,直到碰到字符结束符为止停止计数,所以你说的用*string作为参数传入strlen函数也是可以的,不过这样的目的就是把string指向的变量的指作为地址,因为不能确定string指向的变量的指,所以也就不能预测程序会从哪个地址开始检测,所以这种做法会增加程序的不稳定性和有效性,是错误的。

满意请采纳,不满意请追问

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-30 07:56:00 | 显示全部楼层
戏++ 发表于 2014-7-2 13:19
char* string="i love china"
等价于下面两行
char* string;

链接地址无法访问了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-4 17:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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