分类: 嵌入式
2016-08-07 22:17:18
高级语言,如java、C#使用字符串关键字String来定义字符串变量,String s1 = "linux";而C语言没有原生字符串关键字,字符串的定义是通过字符指针间接实现的。
C语言中定义字符串方法是,定义一个字符指针P,然后P指向字符串的起始地址,
可见,C语言中字符串是由连续分布的多个字符构成的(类似于数组,字符串和字符数组非常像),使用字符指针定义字符串的实质是
(1)指针指向第一个字符地址,
(2)字符串以'\0'结尾,’\0’是隐式加入的,作为字符串结尾的标识符,
(3)组成字符串的各字符彼此地址相连。
'\0'是ASCII字符,即编码为0的字符(null),需要注意区分'\0'和数字0,数字0的编码是48。
'\0'作为一个特殊的数字被定义为字符串结尾标志,副作用就是:字符串中无法包含'\0'这个字符。(C语言中不可能存在一个包含'\0'字符的字符串),这种思路就叫“魔数”(魔数就是选出来的一个特殊的数字,这个数字表示一个特殊的含义,你的正式内容中不能包含这个魔数作为内容)。
char *p = "linux";
p本质上字符指针,占4字节,分配在栈上;
"linux"是字符串,占6个字节(包括’\0’),分配在代码段,这个代码实际占用10个字节。
C语言中存储多个连续字符(如linux)实际上有两种方式
(1)字符串,
(2)字符数组
字符数组char a[5] = "linux";定义了一个数组a,数组a占6字节,右值"linux"本身只存在于编译器中,编译器用它初始化字符数组a后丢弃掉(也就是说内存中是没有"linux"这个字符串的),仅有5个连续分布的字符'l', 'i', 'n', 'u', 'x';
即char a[5] = "linux" 相当于是char a[] = {'l', 'i', 'n', 'u', 'x', '\0'};
char *p = "linux";定义了一个字符指针p,p占4字节,分配在栈上;同时还定义了一个字符串"linux",分配在代码段;然后把代码段中的字符串(一共占6字节)的首地址(也就是'l'的地址)赋值给p。
可见,字符数组和字符串有本质差别。字符数组本身是数组,将字符串作为离散字符存储;而字符串则有字符指针p和字符串两部分,字符串存在代码段中,将首字符的地址赋给字符指针p。