今天在看书上的一段代码的时候发现有一段代码有问题,对于那段代码的错误进行一下解释。
并加强一下我们常用的两种定义字符串的方法的一些区别进行一下解释。
书上的错误代码大概如下:
#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); }
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); }
这个方法就是定义的时候定义字符数组这样就可以实现一个字符一个字符的赋值了。
所以说书上的也不一定都对,编程这种东西永远没有唯一的正确答案,实现一个功能不同的人编都有不同的代码实现的方法也不相同。
所以多动动手,对每一个代码都抱有质疑的态度,没有绝对的权威,去自己摸索更多新的东西这样才能有更大进步,永远踩着别人的脚印走永远不能超过别人。
时间: 2024-10-05 09:43:09