C语言中使用字符指针变量和字符数组的比较

前言:以下话语都是经过自己着重审核的,以最大效力确保没有错别字,以及其他细节的问题,确保不引起读者混乱!读者可以放心的阅读!

使用字符指针变量和字符数组的比较
(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个字节的内容。显然这是没有意义的,应当避免出现这种情况。


版权声明:本文为TianYanRen111原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。