1.误区:字符数组就是字符串
来自:http://www.quanxue.cn/JC_CLanguage/CLang/Clang10.html
#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; }
首先在内存的中位置不同,字符数组保存的字符串存放在内存的栈中,而字符指针指向的字符串保存在内存的静态存储区中。
其次字符数组保存的字符串属于字符串变量,可以被修改,而字符指针指向的字符串是属于字符串常量,不能被修改。
#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; }
#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(c),算的是指针大小。其实c和a的存储空间一样大。都是6。