#include<stdio.h> void copy(char *x,char *y) { for(;*y!='\0';x++,y++) *x=*y; *x='\0';
printf("%s\n",a); } int main() { char *a="Hello!"; char *b="World!"; copy(a,b); return 0; }
字符数组和字符串指针都可以用来存储字符串。
但是字符数组和字符串有本质的区别。
#include<stdio.h> int main() { char a[10]="Hello!"; char *b="world!"; printf("a=%x\n",a); printf("&a[0]=%x\n",&a[0]); printf("b=%x\n",b); printf("&b=%x\n",&b); }
1
2
3
4
|
a=9ffe40
&a[0]=9ffe40
b=404000
&b=9ffe38
|
通过输出我们可以看出来字符数组 a 是一个地址 这个地址就是这段字符数组的首地址 &a 和 &a[0] 都是字符数组的首地址。
而字符串指针 指针变量b 是用来存一段字符串的首地址 &b 就是对着这个指针变量中的数据存储的地址了。
我们对于字符数组可以进行单个字符的改变,因为字符数组就是一堆由字符组成的数组,所以我们对其中一个元素进行修改。
但是字符串指针就是将一个字符类型的指针变量指向了一段字符串,这段字符串是存储在静态数据,对于这些已经定义好的常量我们不能进行随意的修改。
char *a="Hello!"; char *a; a="Hello!";
这两种的定义效果是一样的如果我们分开看就会看的更明白。
字符串指针指向的那一段字符串不能用其他字符串进行替换。
所以说到这里也就明白了书中程序的错误位置和原因了。
*a=*b; *a='\0';
这两个语句都是错误的 字符串指针不能通过这种方式进行修改。这明显是一个错误的代码。
为了实现这种效果我可以有很多的写法在这里举几个例子:
#include<stdio.h> void copy(char *a,char *b) { a=b; printf("%s\n",a); } int main() { char *x="Hello!"; char *y="World!"; copy(x,y); }
这个例子就是直接把b的地址赋给了a这样 a,b姐都指向了同一个字符串,同样起到了赋值的作用。
#include<stdio.h> void copy(char a[],char b[]) { int i=0; for(i=0;i<sizeof(b);i++) { a[i]=b[i]; } printf("%s\n",a); } int main() { char x[]="Hello!"; char y[]="World!"; copy(x,y); }
这个方法就是定义的时候定义字符数组这样就可以实现一个字符一个字符的赋值了。