【问题由来】
请问如下代码段所实现的功能:
int func(char* s)
{
char *t = s;
while(*t++);
return(t-s);
}
【答案】返回字符串s的长度。
产生误解的语句是char *t = s;
。按照之前的理解,死扣指针定义,误以为是定义了一个char类型的指针并指向地址s,则应有*t = s
,指针变量t中存放的是s的地址,最后的返回值也应该是(*t-s)
。
【郑重申明:上述理解是完全错误的!!!】
稍加分析可知,char *t
说明*t
是一个char
类型的指针变量,而s
中存放的是字符串*s
的首地址,其本质就是一个整数,因此*t
和s
两者并没有可比性,自然也不能把s
的值赋给*t
。同理,(*t-s)
也是不存在的。
那么正确的理解应该是怎样的呢?参数s
是一个指针,语句char *t=s;
就是定义一个指向char
类型的指针并初始化为与s
相同的地址,也就是指向同一对象,即字符串s。
还是通过程序来帮助理解吧!其实语句
char *t = s;
可以这样写:
char *t;
t = s;
这样就很容易理解了。
为了加深记忆,已用如下代码进行验证:
#include <stdio.h>
int fun(char *s);
int main()
{
char *str = "abcdefg";
int len;
len = fun(str);
printf("len = %d", len);
return 0;
}
int fun(char *s)
{
char *t = s;// 等价于char *t; t = s;
printf("*s=%c\t s=%d\t *t=%c\t t=%d\n",*s, s, *t, t);
while(*t++)// 等价于while(*(t++))
{
printf("*s=%c\t s=%d\t *t=%c\t t=%d\n",*s, s, *t, t);
};
return(t-s);
}
运行结果如下:
从打印的变量值可以看出,运行语句char *t = s;
后,*t
和*s
的值都是字符串s
的第一个字符'a'
,而s
和t
存放的都是字符串s
的首地址,即字符'a'
的地址。随后指针t
向后移动(即指针+1)直至指向字符串s
结束符,跳出while(1)
循环。字符串结束地址减去首地址即可得到字符串的长度len
。