学科分类
目录
C语言

字符串与指针

在C语言中,字符型指针用char*定义,它不仅可以指向一个字符型变量,还可以指向一个字符串。字符串使用字符数组进行存储,因此,指向字符串的指针其实是指向了存储字符串的数组,例如,定义如下代码:

char arr[6] = "nihao";    //定义一个字符数组arr,存储字符串nihao
char *p = arr;        //定义一个字符型指针p,指向数组arr

上述代码定义了一个字符数组arr存储字符串nihao,然后定义了一个字符类型指针p指向数组arr,此时字符指针p与字符数组arr及字符串“nihao”之间的关系如图1所示。

图1 指向字符串“nihao”的指针p

从图1中可以看出,指向字符串“nihao”的指针其实是指向了字符数组arr,同时也指向数组第1个字符‘n’。由此,我们可以理解为:指向字符串的指针同时也指向了字符串第1个字符。

通过字符串指针可以引用字符数组中的元素,它访问数组元素的方式与整型数组相同,分为索引法与指针运算两种方式,示例代码如下:

p[1];          //访问字符串的第2个字符,值为i
*(p+1);        //访问字符串的第2个字符,值为i

上述代码中,第1行代码通过索引形式访问字符数组中的元素,第2行代码通过指针运算访问字符数组中的元素。除了访问单个字符,当字符指针指向字符串时,通过指针输出字符串,示例代码如下:

printf("%s", p);  //结果为nihao

读者须谨记,当字符指针指向字符串时,如果以%s格式化输出,则直接输出字符串;如果以%d等整型格式化输出,则输出的是字符串所在空间的首地址。

定义指向字符串的指针时,除了使用数组为指针初始化,还可以使用字符串直接给指针进行初始化,示例代码如下:

char *p1 = "nihao";    //使用字符串直接对字符型指针进行初始化

上述代码使用字符串“nihao”直接初始化字符指针,其效果与使用字符数组初始化相同。使用字符数组初始化字符指针之前,字符串已经存在于字符数组在栈区开辟的内存空间中,字符指针只需存储字符数组的地址即可;而用字符串常量初始化字符指针时,系统会先将字符串常量放入常量区,再用指针变量存储字符串的首地址,两者之间的区别如图2所示。

图2 使用字符数组与字符串初始化指针的区别

在操作字符串时,使用字符指针要比字符数组更灵活,下面简单总结一下字符指针与字符数组在初始化、赋值等方面的一些区别。

(1)初始化

可以对字符指针进行赋值,但不能对数组名进行赋值,示例代码如下:

//给字符指针赋值
char *p = "hello";         //等价于char *p=NULL; p = "hello";
//给数组赋值
char str[6] = "hello";
str = "hello";            //错误

上述代码中,第2种赋值方式str=“hello”是错误的,因为数组名是一个指针常量,是内存中的一个地址编号,不可以对其进行赋值。可以使用数组名索引的方式修改字符数组中某个位置的单个字符。

(2)赋值方式

字符数组(或字符串)之间只能单个元素赋值或使用复制函数;字符指针则无此限制。示例代码如下:

//字符指针赋值
char *p1 = "hello", *p2=NULL;
p2 = p1;
//字符数组赋值
char str1[6] = "hello", str2[6];
str2 = str1;  //错误

上述代码中,第2种赋值方式str2=str1是错误的,前面已经讲解,这里不再赘述。

(3)运算

字符指针可以通过指针运算改变其值,而数组名是一个指针常量,其值不可以改变。示例代码如下:

//字符指针
char *p = "I love China";
p+=7;
//数组名
char str[6]=”hello”;
str+=3;                            //错误,数组名是指针常量,不可被更改

(4)字符串中字符的引用

数组可以用索引法和指针运算引用数组元素;字符指针也可以用这两种方法引用字符串的字符元素。示例代码如下:

//字符数组
char *str[100] = " I love China ";
char ch1 = str[6];       //索引法
char *p = str;
char ch2 = *(p+6);       //指针运算
//字符指针
char *p = " I love China ";
char ch2 = p[6];        //索引法
char ch3 = *(p+6);       //指针运算

关于字符串、字符数组、字符指针的区别与联系的诸多细节,需要读者在学习应用当中慢慢体会。

点击此处
隐藏目录