严格意义上来说,C语言并没有字符串原生的字符串的类型,而是通过字符指针来实现的:char *p = "LINUX";。而对于其他的高级语言来说,比如C++的就存在字符串类型: string p1 = "I LOVE LINUX"; 。
字符串在内存中其实就多个字节组成的,且地址都是连续的;指针指向字符串的的头部;字符串的结尾是以"\0"(是真能整的零)作为字符串结束的标志。
"\0" 的理解:
\0 是一个 ASCII 字符,其实是编码为零的字符,是真正的零。这个和数字零是不同的,数字零的 ASCII 是48。
注意:
当定义一个字符串的时候:char *p = "LINUX",系统会在这个字符串的结尾处自动添加‘\0‘,作为结束的标志,所以‘\0‘虽然是连接这最后一个字符,但是并不属于这个字符串。
分配的字符串,是被保存到文字常量区
int main(int argc, char *argv[]) { char *p = "I LOVE LINUX"; printf("%c\n", *p); printf("%s\n", p); while (1); }
输出结果为:
II LOVE LINUX
定义:char p[] = "I LOVE LINUX";
其实就是将字符串放到数组中,在一块连续的内存中依次排放,则数组名则是指向字符串第一个地府的地址 。
int main(int argc, char *argv[]) { char p[] = "I LOVE LINUX"; for (int i = 0; i < 12; i++) { printf("%c", *(p + i)); } while (1); }
或者也可以直接printf("%s\n", p);,输出。
字符数组是将整个字符串一次存在数组中,以上面为例,其实就是一个12个元素的数组。char p[12]={‘I‘,‘‘,‘L‘,‘O‘,‘V‘,‘E‘,‘‘,‘L‘,‘I‘,‘N‘,‘U‘,‘X‘},12 个元素依次排放。
注意: 因为是字符串,所以字符串结尾的地方编译器也是会自动添加 \‘0。分配的字符数组,是被分配到堆中。
sizeof:
是 C 语言的运算符,计算变量的所占据的内存空间的大小。
strlen:
是函数,计算字符串的长度。遇到‘\0‘就结束。
计算:
char str[20] = "0123456789"; int a = strlen(str); ubt b = sizeof(str);
a = 10,因为strlen() 是计算字符串的长度的函数,当遇到‘\0’就结束,所以得到的数值是10
b = 20 ,因为sizeof 函数是计算分配内存空间的大小的,很显然数组是分配了20个字节,所以得到的就是20了。
char *str1 = “abcde”; char str2[] = "abcde"; char str3[8]={‘a‘,}; char str4[] = "0123456789"; sizeof(str1); // 4 sizeof(str2); // 6 sizeof(str3); // 8 sizeof(str4); // 11
分析,首先可以知道sizeof 函数是计算分配内存空间大小的。str1 显然就是一个指针嘛,不论怎么样,只占所占的字节数,永远都是四个字节;str2 是字符数组,虽然字母是五个,但是必须知道字母的后面接有一个看不见的‘\0‘作为字符串的结束的标志,所以就总共了6个字符,所以就是6个字节了;str3 显然已经定义了数则的长度是8,所以只能是八个字节;str4 显然也是一个字符数则,十个字符加上一个‘\0‘字符串结束标志,总共11个字符,所以11个字节。
原文:http://www.cnblogs.com/qxj511/p/4934512.html