在c语言中 ,字符指针 char *str2; 和字符数组char str1[]都可以表示字符串。
当 char*str2="abcd"的时候,在常量区开辟了一个空间存放字符串,而str2直接指向了常量区的地址,常量区的内容是不可以改变的(不能通过str2[0]='m'或者*(str2+1)='m'这种形式企图对里面的内容进行修改),不能再对里面的内容进行修改。但str2是一个指针变量,它可以指向别的址。例如:
虽然在这里对a进行了重新的赋值,但是,事实上它是将“sajx”在常量区的地址给了字符指针变量str2,从运行结果是可以看出来的。当企图对常量区里面的内容进行修改,程序就会崩溃,后面的printf就没有执行
而char str1[]="abcd",其中abcd仍然是存在常量区,在程序中声明字符数组的时候为其开辟了空间(栈)并用“abcd”将其进行初始化,相当于把常量区的内容拷贝到字符数组里,此时可以对字符数组里面的内容进行修改,但是当声明时已经为其开辟了内存,数组名str1就是指针,就是该段内存的首地址(指针就是地址),此时他是他是一个常量(地址),不能再对其进行自增,自减等运算。!!不能用字符串对字符数组进行赋值(char n[20];n="acjnas"),前面说了用字符串给字符指针赋值相当于把字符串在常量区的首地址给字符指针,而在字符数组里,数组名已经是常量(地址),常量怎么能被赋值呢?
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(){
char *str1;
char str2[20]="abcdef";
//str1=(char*)malloc(20);
str1=str2;
gets(str1);
printf("%s",str2);
//free(str1);
}
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(){
char *str1;
str1=(char*)malloc(20);
gets(str1);
printf("%s",str1);
free(str1);
}
想对字符指针里面的内容进行修改就要通过malloc函数得到一段地址,让str2指向malloc获得的地址,此时可以对里面的内容进行修改,例如
int main(){
char *str1;
str1=(char*)malloc(20);
printf("%p\n",str1);
char a[20]="i am a man!";
strcpy(str1,a);
printf("%s\n",str1);
printf("%p\n",str1);
free(str1);
}
运行结果为
0000000000B613E0
i am a man!
0000000000B613E0
使用字符指针变量时应该先给他一段内存的地址,然后才能对其进行赋值等操作,free之后这块内存的使用权就不是str1,可以分配给其他地方,肯能仍可以调用,但是是非法的,有可能会出错。