在指针类型中有一种字符指针类型:char*
char*的一般使用
char ch = 'a';
char* pc = &ch; // pc就是字符指针 存放char类型变量的地址
*p = 'w'; // 通过指针解引用访问/修改ch
指向字符串
char arr[] = "abcdef";
char* p = arr;
数组名就是数组首元素的地址,p存放的不是数组arr本身,而是它的首地址。字符串是连续的,有了它的首地址,就可以访问它的所有内容。
注:如果你不知道数组名是数组首元素地址,可以通过%p打印arr和&arr[0]验证。
执行以下语句
printf("%c\n", *p);
printf("%s\n", p);
结果:
对p解引用找到的是数组首元素a,即*p与arr[0]等价;通过%s格式打印p,即打印了p指向的字符串。
指向字符串常量
char* p = "abcdef";
p指向一个常量字符串"abcdef",此时仍可以通过p打印字符串的内容。
常量字符串是不能修改的,也就无法通过指向它的指针修改它。如果一个字符指针指向常量字符串,应该const修饰,避免对字符串进行修改。
const char* p = "abcdef";
一道面试题目
以下程序的输出结果是什么?
#include <stdio.h>
int main()
{
char str1[] = "hello bit.";
char str2[] = "hello bit.";
const char* str3 = "hello bit.";
const char* str4 = "hello bit.";
if (str1 == str2)
printf("str1 and str2 are same\n");
else
printf("str1 and str2 are not same\n");
if (str3 == str4)
printf("str3 and str4 are same\n");
else
printf("str3 and str4 are not same\n");
return 0;
}
答案:
分析:
str1和str2是两个数组,它们各有一块内存空间,即使它们的内容相同,也不会共用同一块内存,因为它们就是两个不同的变量,它们的内容可以随时修改。str1和str2不相同。
str3和str4分别指向一个常量字符串,常量字符串是不能被修改的,所以str3和str4指向同一块内存即可。str3和str4相同。
注意指针变量存放的是地址,比较两个指针变量就是比较它们的内容,也就是它们存放的地址。
继续学习指针内容,见下篇:指针数组