techmagician 发表于 2014-7-2 01:12:47

字符串指针的理解

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

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


如何去理解?

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

喜欢散步 发表于 2014-7-2 04:46:39

你输出string 与输出*string看看结果是否一样……

santaclaus 发表于 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也就舍弃了你说的那种方式。



                              

华彩篇章 发表于 2014-7-2 09:58:55

定义一个指针这个指针指向这个字符串的地址

戏++ 发表于 2014-7-2 13:19:15

char* string="i love china"
等价于下面两行
char* string;
string="i love china"

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

看下这里的第三课,有好处
http://chinasvn.xicp.net/

折心灬小轩 发表于 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指向的变量的指,所以也就不能预测程序会从哪个地址开始检测,所以这种做法会增加程序的不稳定性和有效性,是错误的。

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

dequantianhe 发表于 2019-10-30 07:56:00

戏++ 发表于 2014-7-2 13:19
char* string="i love china"
等价于下面两行
char* string;


链接地址无法访问了
页: [1]
查看完整版本: 字符串指针的理解