【时时三省】(C语言基础)使用字符指针变量和字符数组的比较
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省
用字符数组和字符指针变量都能实现字符串的存储和运算,但它们二者之间是有区别的,不应混为一谈,主要有以下几点。
( 1 )字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符串第1个字符的地址),绝不是将字符串放到字符指针变量中。
( 2 )赋值方式。可以对字符指针变量赋值,但不能对数组名赋值。
( 3 )初始化的含义。对字符指针变量赋初值:
char * a = " I love China ! " ;
等价于
char a;
a = " I love China !”;
而对数组的初始化:
char str [ 14 ] = " I love China !”;
不等价于
char str [ 14 ] ;
str [ ]= " I love China !”;
数组可以在定义时对各元素赋初值,但不能用赋值语句对字符数组中全部元素整体赋值。
( 4 )存储单元的内容。编译时为字符数组分配若干存储单元,以存放各元素的值,而对字符指针变量,只分配一个存储单元( VisualC++为指针变量分配4个字节)。
如果定义了字符数组,但未对它赋值,这时数组中的元素的值是不可预料的。可以引用(如输出)这些值,结果显然是无意义的,但不会造成严重的后果,容易发现和改正。
如果定义了字符指针变量,应当及时把一个字符变量(或字符数组元素)的地址赋给它,使它指向一个字符型数据,如果未对它赋予一个地址值,它并未具体指向一个确定的对象。此时如果向该指针变量所指向的对象输入数据,可能会出现严重的后果。
( 5 )指针变量的值是可以改变的,而字符数组名代表一个固定的值(数组首元素的地址),不能改变。
( 6 )字符数组中各元素的值是可以改变的(可以对它们再赋值),但字符指针变量指向的字符串常量中的内容是不可以被取代的(不能对它们再赋值)。
( 7 )引用数组元素。对字符数组可以用下标法(用数组名和下标)引用一个数组元素(如a [ 5 ]),也可以用地址法(如*(a + 5))引用数组元素a [ 5 ]。如果定义了字符指针变量p,并使它指向数组a的首元素,则可以用指针变量带下标的形式引用数组元素(如p [ 5 ]),同样,可以用地址法(如*(p + 5))引用数组元素a[5]。
但是,如果指针变量没有指向数组,则无法用p [ 5 ]或* ( p + 5 )这样的形式引用数组中的元素。这时若输出p [ 5 ]或* ( p + 5 ),系统将输出指针变量p所指的字符后面5个字节的内容。显然这是没有意义的,应当避免出现这种情况。
若字符指针变量p指向字符串常量,就可以用指针变量带下标的形式引用所指的字符串中的字符。
( 8 )用指针变量指向一个格式字符串,可以用它代替printf函数中的格式字符串。