字符串处理问题
/*从指定的字符串中查找ch字符,返回第一次出现的位置
*/
const char *my_strchr(char const *str, const char ch)
{
assert(str);
for(; *str != '\0'; str ++)
{
if(*str == ch)
{
return str; //返回的是ch所在的地址
}
}
return NULL; //没有找到字符
}
如上是字符串中查找指定字符的函数,实际应用时发现如下现象:
int main(void)
{
char *string1 = "hello world !";
char *string2 = "a warm welcome !";
char a = 'o';
/*
char *e = "efg";
e = str();
printf("%s\r\n", e); //打印出来的是abc而不是efg
*/
/*
运行结果:*addr:111(十进制), 'o'(字符型)
addr:4337716 addr指向的地址,也就是函数返回的地址
&addr:1244984 addr本身的地址,也就是指针变量addr的地址
说明:addr指向的地址中的数据是正确的,指向的内容为正要查找的字符
*/
#if 1
printf("\r\n string1 address %p \r\n", string1);
const char *addr = my_strchr(string1, a);
printf("\r\n string1 address %p \r\n", my_strchr(string1, a));
printf("\r\n string1 address %p \r\n", addr);
printf("\r\n string1 address %p \r\n", string1); //字符串常量地址是不会更改的。
}
如下是执行结果
string1 address 00424158
my_strchr return address 0042415C
addr address 0042415C
string1 address 00424158
Press any key to continue
我的问题是函数已经对string1的指针做了更改,并且更改的值作为函数的返回地址,为什么最后一行打印出来的地址还是未变,而不是函数返回的地址,异或变量addr的地址??