1.字符指针普通用法
字符指针顾名思义就是存放字符的地址,并且字符指针加减整数是向前或者向后走一个char的字节,在解引用操作的时候访问权限也是一个字节。
#include
int main () {
char ch = 'a';
char * p = &ch;
*p = 'z';
printf("%c" , ch); // z
return 0;
}
2.字符指针指向一个字符串
字符指针指向一个字符串时,本质上是存放字符串第一个字符的地址,通过指向第一个字符的地址来依次寻找后面的字符。
注:字符指针指向的字符串是常量字符串,存放在常量区,是不可以改变的。 所以字符指针最好用const修饰,否则当不经意间修改会导致程序崩溃。
#include
int main () {
// hello world 存放在常量区是不可以修改的
char * str = "hello world";
*str = 'a'; // error
return 0;
}
例子:
#include
int main () {
const char * p1 = "abc";
const char * p2 = "abc";
char str1[] = "abc";
char str2[] = "abc";
if (p1 == p2) {
printf("p1 == p2\n");
} else {
printf("p1 != p2\n");
}
if (str1 == str2) {
printf("str1 == str2\n");
} else {
printf("str1 != str2\n");
}
/*
result:
p1 == p2
str1 != str2
解析:
1. 字符指针指向的字符串是常量字符串,是不可以修改的,当执行
**const char * p1 = "abc"**时,先会在常量区中寻找,若没有
则创建。执行**const char * p2 = "abc"**,会在常量区中寻找,
因为常量区已经有"abc"了,所以直接把首字符地址赋值给p2,所以
p1和p2指向的地址是相同的。
2. 而str1和str2是字符数组是局部变量在栈上开辟,每一次开辟都
会创建新的空间,所以str1和str2指向的数据是一样的,但是存放
首元素的地址是不同的。
*/
return 0;
}