1.误区:字符数组就是字符串
来自:http://www.quanxue.cn/JC_CLanguage/CLang/Clang10.html
- 字符数组,完整地说叫字符类型的数组。字符数组不一定是字符串。
- 字符串是最后一个字符为NULL字符的字符数组。字符串一定是字符数组。
- 字符数组的长度是固定的,其中的任何一个字符都可以为NULL字符。
- 字符串只能以NULL结尾,其后的字符便不属于该字符串。
- strlen()等字符串函数对字符串完全适用,对不是字符串的字符数组不适用。
#include <stdio.h>
#include <string.h>
int main(void)
{
//这是字符数组赋初值的方法
char cArr[] = {'Q','U','A','N','X','U','E'};
//这是字符串赋初值的方法
char sArr[] = "quanxue";
//用sizeof()求长度
printf("cArr的长度=%d\n", sizeof(cArr)); //长度为7
printf("sArr的长度=%d\n", sizeof(sArr)); //长度为8,最后一位是NULL
//用printf的%s打印内容
printf("cArr的内容=%s\n", cArr); //不能正确显示
printf("sArr的内容=%s\n", sArr); //可以正确显示
//用strlen()求长度
printf("cArr的长度=%d\n", strlen(cArr)); //不正确的结果
printf("sArr的长度=%d\n", strlen(sArr)); //NULL不在计算范围
return 0;
}
2.字符数组与字符指针
首先在内存的中位置不同,字符数组保存的字符串存放在内存的栈中,而字符指针指向的字符串保存在内存的静态存储区中。
其次字符数组保存的字符串属于字符串变量,可以被修改,而字符指针指向的字符串是属于字符串常量,不能被修改。
#include <stdio.h>
int main()
{
char str[12] = {'h','e','l','l','o',' ','w','o','r','l','d'};
char* ptr = "hello world";
str[0] = 'f';
ptr[0] = 'f'; //将字符指针指向的字符串修改,将出现段错误,因为该内存地址只读(常量区),因为该字符串属于常量
return 0;
}
3.关于其它自己验证的代码:
#include <stdio.h>
void main()
{
char a[] = "hello";
char b[5] = "hello";
char *c = "hello";
printf("sizeof:%d,strlen:%d,%s\n", sizeof(a),strlen(a), a);
printf("sizeof:%d,strlen:%d,%s\n",sizeof(b),strlen(b), b);
printf("%c", a[5]);
printf("sizeof:%d,strlen:%d",sizeof(c),strlen(c));
int i;
for(i=0;i<sizeof(a);i++)
{
printf("%c", a[i]);
}
}
输出:
sizeof:6,strlen:5,hello
sizeof:5,strlen:5,hello
sizeof:4,strlen:5hello
解释:关于sizeof(c),算的是指针大小。其实c和a的存储空间一样大。都是6。