用字符数组和字符指针变量都可实现字符串的存储和运算。但是两者是有区别的。在使用时应注意以下几个问题:
1. 字符串指针变量本身是一个变量,用于存放字符串的首地址。而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以‘\0’作为串的结束。字符数组是由于若干个数组元素组成的,它可用来存放整个字符串。
2. 对字符串指针方式
char *ps="C Language";
可以写为:
char *ps;
ps="C Language";
而对数组方式:
static char st[]={"C Language"};
不能写为:
char st[20];
st={"C Language"};
而只能对字符数组的各元素逐个赋值。
从以上几点可以看出字符串指针变量与字符数组在使用时的区别,同时也可看出使用指针变量更加方便。
当一个指针变量在未取得确定地址前使用是危险的,容易引起错误。
一个错误的例子,如下:
char *name;
scanf("%s",name);
printf("%s",name);
有的编译器虽然也能通过,但这是错误的,因为是个指针,定义时指向不可用的地址。解决这个问题有两种方法:用数组的方法或给字符针针分配内存空间的方法。
数组的方法:
char name[20];
scanf("%s",name);
printf("%s",name);
给字符针针分配内存空间的办法:
char *name;
name=(char*)malloc(50); //此时name已经指向一个刚刚分配的地址空间。
scanf("%s",name);
printf("%s",name);
但是对指针变量直接赋值是可以的。因为C系统对指针变量赋值时要给以确定的地址。
3.int main(){
char str1[40]="hello world!"; //char *str1="hello world!";
str1[4]='A'; //若str1是指针型的,编译通过,但运行是此处会段错误
printf("%s\n",str1);
return 0;
}