C语言之指针和字符串

指针和字符串概述:
可以利用一个指向字符型的指针处理字符数组和字符串,其过程与通过指针访问数组元素相同。
使用指针可以简化字符串的处理,是程序员处理字符串常用的编程方法。

可以定义一个字符数组,用字符串常量初始化它,例如:char str[]="C Language" ;
系统会在内存中创建一个字符数组str,且将字符串常量的内容复制到数组中,
并在字符串末尾自动增加一个结束符'\0'。

 

C语言允许定义一个字符指针,初始化时指向一个字符串常量,
一般形式为:char *字符指针变量=字符串常量,....

 

虽然没有定义字符数组,但在程序全局数据区中仍为字符串常量分配了存储空间,
而且以数组形式并在字符串末尾自动增加一个结束符'\0'。
显然,这个字符串常量是有地址的。初始化时,p存储了这个字符串
首字符地址4000,而不是字符串常量本身,称p指向字符串

还可以在程序语句中,用字符串常量赋值给字符指针变量p
例如:char *p; p="C_ Language";
//正确"... ”字符串常量既是字符数组,又表示字符串首地址,两者均是char*
无论哪种形式都是为指针变量赋地址值,而不是对*p赋值。
赋值过程中只是将字符串的首地址值存储在p中,而不是将字符串存储在p中。
p仅是一个指针变量,它不能存放字符串的全部字符,只能存放一个字符串的指针(或地址)

字符指针变量p除指向字符串常量外,还可以指向字符数组。
例如:char str[]="C Language", *p=str; //p指向字符串的指针
通过字符指针可以访问字符串,例如通过字符指针输出字符串printf("%s", p);

%s格式会将输出项当作字符串输出,输出项参数此时必须为字符串地址,
printf从该地址对应的字符开始输出,每次地址自增,直到遇到空字符为止。例如:

 

 通过字符指针遍历字符串的两段代码:

扫描二维码关注公众号,回复: 8600211 查看本文章

 

两段程序的运行结果相同,但它们之间有一个重要区别:
即记忆字符串首地址的方式不一样。程序①运行后若要让p再次指向字符串,
只要p=str即可,因为字符串的首地址就是字符数组名。
而程序②运行后若要让p再次指向字符串,就困难了。因为字符串的首地址
开始给了p,但运算p++后,p发生了变化从而使得p变成了"迷途指针”。

 

解决这个问题的办法是在程序②中另外引入一个指针变量记住字符串的首地址。例如:

 

  

程序第6行while表达式的*p是*p!=^\0'的简写形式,两者作为逻辑结果
是完全等价的,含义是判断p所指向的数组元素是否为空字符'\0';
如果不为空字符则p++,使指针移向下一个元素继续判断。

指针相减的含义:

 

当p指向空字符时,转向第7行,如图所示。p-str的结果
是两个地址间字符元素的数目,正好是字符串的长度(不计空字符)。

 

指针与字符数组的比较:

1.存储内容不同:
字符数组能够存放字符串所有字符和结束符,字符指针仅存放字符串的首地址。
即定义字符数组,系统会为其分配指定长度的内存单元,而定义指针变量,
系统只分配4个字节的内存单元用于存放地址。
2.运算方式不同:
字符数组s和字符指针p尽管都是字符串的首地址,但s是数组名,
是一个指针常量,不允许做左值和自增自减运算。
而p是一个指针变量,允许做左值和自增自减运算。
作为地址值,s在程序运行期间不会发生变化,而p是可变的。
3.赋值操作不同:
字符数组s可以进行初始化,但不能使用赋值语句进行整体赋值,
只可以按元素来赋值。例如:

 

字符指针既可以进行初始化,也可以使用赋值语句。

 

 字符串数组是一个二维字符数组:

 

按一维数组的角度来看,数组sa有6个元素,每个元素均是一个一维字符数组,即字符串。
因此数组sa可以理解为包含6个字符串的一维数组,例子中的初值正是字符串的写法。

由于一个字符指针可以指向-一个字符串,为了用指针表示字符串数组,
需要使用指针数组。例如:

其中pa为一维数组,有6个元素,每个元素均是一一个字符指针。

指向字符串数组的指针:
1.用字符串数组存储若干个字符串时,由于二维数组每一行包含的元素个数要求相等,
因此需要取最大的字符串长度作为列数。而实际应用中的各个字符串长度一般是不相等的,
若按最长字符串来定义列数,必然会浪费内存单元。
2.若使用字符指针数组,各个字符串按实际长度存储,指针数组元素
只是各个字符串的首地址,不存在浪费内存单元问题。
3.在计算机信息处理中,对字符串的操作是最常见的,如果使用指针方式,
会大大提高处理效率。例如,对若干字符串使用冒泡法按字母排序,如果用数组方式,
比较交换时会产生字符串复制的开销。若使用字符指针数组,
只需交换指针值改变指向,而字符串本身无需做任何操作。

猜你喜欢

转载自www.cnblogs.com/ZengBlogs/p/12193439.html