C语言是没有字符串类型的,字符串是存放在字符型数组中。C语言只有字符变量,没有字符串变量。
使用字符指针变量和字符数组的比较:
(1)字符数组有若干个原始组成,每隔元素中放一个字符,而字符指针变量中存放的是地址(字符串第一个字符的地址),绝不是将字符串放到字符指针变量中。
(2)赋值方式:可以对字符指针变量赋值,但对不能对数字名赋值。
可以采用下面方法对字符指针变量赋值:
char *a; //a为字符指针变量 a = "I love China"; //将字符串首元素地址赋给指针变量,合法。但赋给a的不是字符串,而是字符串第一元素的地址。
不能用以下办法对字符数组名赋值:
str[0] = 'I'; //对字符数组元素赋值,合法! str = "I love China"; //数组名是地址常量,不能被赋值,非法!
(3)初始化的含义,对字符指针变量赋初值:
char *a = "I love China";//定义字符指针变量a,并把字符串第一个元素的地址赋给a
等价于:
char *a; //定义字符指针变量a a = "I love China"; //把字符串第一个元素的地址赋给a
而对数组的初始化:
char str[14] = "I love China"; //定义字符数组str,并把字符串赋给数组中各元素
不等价于:
char str[14]; //定义字符数组str str = "I love China"; //企图把字符串赋给数组中各元素,错误
数组可以在定义时对各元素赋初值,但不能用赋值语句对字符数组中全部元素整体赋值。
(4)存储单元的内容。
编译时为字符数组分配若干存储单元,以存放各元素的值,而对字符指针变量,只分配一个存储单元(32位机一般4B)
(5)指针变量的值是可以改变的,而数组名代表一个固定的值(数组元素的地址),不能改变。
char *a = "I love China"; a = a + 7; //改变指针变量的值,即改变指针变量的指向 printf("%s\n", a); //输出从a指向的字符开始的字符串
char str[] = "I love China"; str = str + 7; //数组名虽然代表地址,但它是常量,值不能改变。不合法。
(6)字符数组中各元素的值是可以改变的(可以对它们再赋值),但是字符指针变量指向的字符串常量中的内容是不可以被取代的(不能再赋值)。
(7)引用数组元素。
字符数组可以用下表法(用数组名和下表)引用一个数组元素(如a[5]),也可以用地址法(如*(a + 5))。
如果定义了字符指针变量p,并使他指向数组a的首元素,则可以用指针变量带下表的形式引用数组元素(如p[5]),地址法(如*(p + 5))引用数组元素a[5]。