如果定义的指针变量的基类型是char型,那么该指针变量就是字符指针变量
1.字符指针变量的定义与引用
字符指针变量定义的例子:
char *pc;
字符指针变量可以指向普通的字符型变量,如下面的例子:
char c;
pc = &c; //字符指针变量指向字符型变量c
(*pc)='Z'; //这条语句等效于c = 'Z';
字符指针变量也可以指向字符串的存储空间,如字符数组或字符串常量
2.字符指针变量与字符数
字符指针变量可以指向数组元素,如下面的例子:
char ch[20];
pc = ch; //pc的值为字符数组ch的首地址,即pc指向第0个元素
pc++; //pc指向字符数组下一个元素,即第1个元素
如果在printf函数、cout语句里,输出表达式是一个字符数组名或字符指针变量,或者表达式的值表示的是一个字符数组中某个元素的地址,那么输出内容是从当前字符开始一直到字符串结束标志之间的字符串
char str[] = "I love CHINA!";
printf("%s\n", str); //输出:I love CHINA!,也可以用cout << str << endl;
char *pc = str;
printf("%s\n", pc); //输出:I love CHINA!,也可以用cout << pc << endl;
printf("%s\n", str+7); //输出:CHINA!,也可以用cout << str+7 << endl;
3.字符指针变量与字符串常量
7.4中提到,“如果能获得字符串常量存储空间的首地址,那么就可以访问字符串常量中的每个字符”。字符指针变量就可以实现这一点
如果将一个字符串常量赋值给一个字符指针变量,则字符指针变量的值就是字符串常量存储空间的首地址。如:
char *pc;
pc = "Welcome to C/C++!";
pc指向的就是这个字符串常量的第0个元素,通过这个字符指针变量就可以输出字符串常量中的每个字符
例:使用字符指针变量输出字符串常量中的字符
#include<bits/stdc++.h>
using namesapce std;
int main()
{
char *pc1,*pc2;
pc1 = pc2 = "Welcome to C/C++!"; //字符指针变量pc1和pc2指向字符串常量
for( ;(*pc1)!='\0';pc1++) //采用字符指针变量输出字符串常量中的每个字符
printf("%c", *pc1);
printf("\n");
printf("%s", pc2+11); //(1)从字符串常量的第11个字符开始输出
printf("\n");
return 0;
}
4.字符指针变量、字符数组、字符串常量的区别与联系
字符指针变量、字符数组、字符串常量这三者之间既有联系又有区别
char *pc;
char str[20] = "Welcome";
接下来以字符指针变量pc和字符数组st为例解释字符指针变量、字符数组、字符串常量这三者之间的联系与区别:
①字符数组str由若干元素组成,每个元素放一个字符,在初始化时可以用字符串常量对字符数组赋值,除此之外,不能把字符串常量赋值给字符数组;字符指针变量ρc存放的是字符数据的地址,在任何时候,都可以把字符串常量赋值给字符指针变量,实际上是把字符串常量的首地址赋值给字符指针变量。如下面的语句:
str = "I love China!"; //(✘)
pc = "I love China!"; //(✔)
②数组名str是地址常量,代表整个数组的首地址,它的值不能改变;指针变量pc是地址变量,它的值可以改变。如"str++”是非法的,而“pc++”是合法的
③可以往字符数组str中输入字符串;但是通过字符指针变量pc输入字符串时,必须先让字符指针变量c指向某个字符数组(即某段存储空间),才能输入字符串
scanf("%s", str ); //(✔)
scanf("%s", pc); //(✘)
pc = str; scanf("%s", pc ) //(✔)
④字符串常量所占的每个字节的内容都是不允许修改的,如下面的例子;但如果把字符串常量赋值给字符数组后,字符数组元素的值是可以改变的
char *pc = "Welcome"; (*pc) = 'a'; //(✘)通过字符指针变量修改字符串常量中的字符是非法的
char c[ ] = "Welcome"; c[0] = 'a'; //(✔)修改字符数组元素的值是合法的