这本来是前天写的内容,一直拖到了现在,本来打算今天晚上写,又怕拖到明天,现在写了吧。该死的拖延症。
在编程的时候这块遇到好几次问题。而且越看越糊涂,上网查了查,自己写一写,看看对不对。有雷同,有改进。
字符串数组与字符串指针的区别
C中没有字符串数据类型,一般使用数组对字符串进行各种操作。
(1)字符串指针
字符串指针是定义了一个指针变量,指针变量存储的是某个字符串的内存首地址。他是指针变量被放在内存中的栈区。在编译器编译时,会自动在字符串结尾处添加结束标识符' '。
(2)字符串数组
字符串数组是用数组来存储字符串。字符串数组作为变量存储在内存中的栈区。C对于字符数组没有硬性规定一定要在末尾处添加结束符,即可有可无。但好多字符串函数都是以结束符作为判断的标志,所以要注意在使用字符数组时记得在末尾处添加结束符。
(3)关于字符串指针和字符串数组初始化的问题
首先解释字符串常量。字符串常量是这静态存储区中的一段连续的内存,以' '结束。只读,不可修改。
a.字符串指针初始化
可使用字符串常量对指针初始化,如下所示:
char *p = "hello world";
或
char *p;
p = "hello world";
使用字符串常量对指针初始化时,指针是变量存储在内存中的栈区,字符串常量存储在静态存储区,不可修改,如果修改会出现未定义错误。例子:
char *p = "hello world";
*(p + 1) = 'E'; //这样的赋值是错误的,不能更改字符串常量
b.字符数组初始化
可使用字符串常量对数组初始化,如下所示:
char str[] = {"hello world"};
也可以对数组单个元素初始化,如下所示:
char str[] = {'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'};
使用字符串常量对数组初始化时,数组作为变量存储在内存中的栈区,字符串作为元素值被放在数组所分配的内存空间中。且可对数组元素进行修改。
char str[] = {"hello world"};
str[0] = ’H'; //这样的操作是正确的
(4)字符串数组中的结束符问题
C对于字符数组没有硬性规定一定要在末尾处添加结束符。
a.当表明数组大小时,
char str[4] = {"Good"};
b.当未表明数组大小时,
char str[] = {"Good"};
即 char str[0] = {'G'}; char str[1] = {'o'}; char str[2] = {'o'}; char str[3] = {'d'}; char str[4] = {' '};
上述是表明数组大小与未表明数组大小编译器的方式
(5)使用指针时要防止出现段错误,防止指针指向内存中不明空间。
当一个指针变量在未取得确定地址前使用是危险的,容易引起错误。
一个错误的例子,如下:
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);