1
2
3
4
5
6
7
8
9
10
11
12
|
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main()
{
char *p1=“name”;
char *p2;
p2=(char*)malloc(20);
memset(p2, 0, 20);
while(*p2++ = *p1++);
printf(“%s\n”,p2);
}
|
运行结果你猜是什么。
结果是空,打印处就一换行。
其实这题很简单,p1和p2地址一直在增加,当遇到 \0时就复制结束,也就停在那里,即其指向了字符结尾处。虽然简单却容易犯错。
这一题明显有考strcpy的含义,于是就在网上搜strcpy源码是什么写的,显示如下:
1
2
3
4
5
6
|
char *strcpy(char *d,const char *s)
{
char *r = d;
while(*d++ = *s++);
return r;
}
|
看到源码于是又想问,这里不也是*d++吗,在外面打印是不是也会出现*d是不是也会出现空字符串呢,其实不是。
这里就用到作用域的概念,将strcpy写成一个单独的函数,其传递的参数是形参,即*r也是指向字符串的一个指针,不再是原来的指针,它只是改函数的局部变量而已,一旦strcpy函数执行完毕就消失了,所以大牛们没有写成这个样子,如下:
1
2
3
4
5
6
|
char *strcpy(char *d,const char *s)
{
char *r = d;
while(*r++ = *s++);
return d;
}
|
至此,写完了,总结一下,大牛们写的函数都是很经典的,膜拜啊.....