前言:以下话语都是经过自己着重审核的,以最大效力确保没有错别字,以及其他细节的问题,确保不引起读者混乱!读者可以放心的阅读!
使用字符指针变量和字符数组的比较
(1)字符数组有若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符串第1个字符的地址),绝不是将字符串放到字符指针变量中。
(2)赋值方式:可以对字符指针变量进行赋值,但不能对数组名进行赋值。
char *a; //a为字符指针变量
a=”I love china!” //将字符串首元素地址赋给指针变量,但赋给a的不是字符串,而是字符串第一个元素的地址。
//不能用以下办法对字符数组名赋值:
char str[14];
str[0]=‘i’; //对字符数组元素赋值,合法
str=”I love china!”; //数组名是地址,是常量,不能被赋值,非法
(3)初始化的含义。对字符指针变量赋初值。
char *a=“I love china!”; //定义字符指针变量,并把字符串第一个元素的地址赋给a
//等价于:
char *a; //定义字符指针变量a
a=“I love china!”; //把字符串第一个元素的地址赋给a
//而对数组的初始化:
char str[14]=“I love china!” //定义字符数组str,并把字符串赋给数组中各元素
//不等价于:
char str[14]; //定义字符数组
str[14]=“I love china!”; //企图把字符串赋给数组中各元素,非法
//数组可以在定义时对各元素赋初值,但不能用赋值语句对字符数组中全部元素整体赋值。
(4)存储单元的内容。
编译时为字符数组分配若干存储单元,以存放各元素的值,而对字符指针变量,只分配一个存储单元。
注意:如果定义了字符数组,但未对其赋值,这时数组中的元素的值是不可预料的。可以引用这些值,结果显然是毫无意义的,但不会造成严重的后果,容易发现和改正。
如果定义了字符指针变量,应当及时把一个字符变量(或字符数组的元素)的地址赋给它,使它指向一个字符型数据,如果未对它赋予一个地址值,它并未具体指向一个确定的对象,此时如果向该指针变量所指向的对象输入数据,可能会出现严重的后果。
//例如:
char *a; //定义字符指针变量a
scanf(“%s”,a); //企图从键盘输入一个字符串,使a指向该字符串,非法
编译时发出警告信息,提醒未给指针变量指定初始值(未指定其指向),虽然也能勉强运行,但这种方法是非常危险的。因为编译时给指针变量a分配了存储单元,变量a 的地址是已经指定了,但a并未被赋值,在a的存储单元中是一个不可预料的值。在执行scanf函数时,要求将一个字符串输入到a所指向的一段存储单元中。而a的值如今却是不可预料的,它可能指向内存中空白的用户存储区中(这是良好的情况),也有可能指向已经存放指令或数据的有用内存段,这就会破坏程序或有用数据,甚至破坏系统,会造成严重的后果。应当坚决杜绝此类情况的发生。应该在定义指针变量后,及时指定其指向。
例如:
char *a,str[10]; //定义了字符指针变量a和字符数组str
a=str; //使a指向str数组当然首元素
scanf(“%s”,a); //从键盘输入一个字符串存放到a所指向的一段内存单元中,正确
//先使a有确定值,使a指向一个数组元素,然后输入一个字符串,把它存放在以该地址开始的若干单元中。
(5)指针变量的值是可以改变的,而数组名代表一个固定的值(数组首元素的地址),不能改变。
{
char *a=“I love China!”; //定义字符指针变量,并把字符串第一个元素的地址赋给a
a=a+7; //改变指针变量的值,即改变指针变量的指向
printf(“%s\n”,a); //输出从a指向的字符开始的字符串
return 0;
}
程序分析:指针变量a的值是可以改变的。
//下面是非法的:
char str[]=“I love china!”;
str=str+7;
printf(“%s”,str);
数组名虽然代表的是地址,但它是常量,它的值是不能改变的!
(6)字符数组中各元素的值是可以改变的;但字符指针变量指向的字符串常量中的内容是不可以被取代的(不能对它们再赋值)。
//例如:
char a[]=“house”; //字符数组a初始化
char *b=“house”; //字符指针变量b指向字符串常量的第一个字符
a[2]=‘r’; //合法。r取代a数组元素a[2]的原值u
b[2]=‘r’; //非法。字符串常量不能改变
(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个字节的内容。显然这是没有意义的,应当避免出现这种情况。