字符指针可以像普通指针一样快速访问和处理字符,但字符较于其他类型相对复杂,需要理清一下关系。
一、字符、字符数组、字符串和字符指针
1.字符、字符数组和字符串的关系
字符数组末尾有了休止符就是字符串,两者的类型是完全相同的,只是在占用内存(休止符占用一个字符的内存)输出的时候
字符数组名内容是首位地址即为若有char buf[n];,则buf==buf[0]。字符数组就是字符组成的数组,用地址顺序组织字符,关系如下图:
2.三者和字符指针的关系
之前的时候我有个误区,当字符指针指向字符数组或字符串的时候,字符指针的本质关系就属于了数组,然而实际上字符指针本质上是单个字符的指针而非字符串,针对字符串的指针指的是与行指针(基本类型就是一个数组)同类的指针。
因此,将字符指针赋值给字符串的本质是将字符的首个字符的地址付给了字符指针,并非直接和字符串的关系:
3.常量与变量
字符的地址、数组名和固定的字符串名(“good”)都是指针常量,可以赋值给指针变量。
但本身不可以被赋值或修改。
同一个指针常量或者变量有相同的地址。
二、实验验证暨代码练
#include<stdio.h>
#include<stdlib.h>
int main() {
printf("开始吧\n");
system("pause");
printf("实验一 hello\n"); //分别比较 字符数组 和 字符串 的指针的 字符 和 字符串 输出
system("pause");
char buf1[] = { 'h','e','l','l','0' }; //字符数组(不带结束符)
char buf2[] = "hello"; //字符串(带有结束符号)
char* p1 = buf1; //配置指针
char* p2 = buf2;
printf("%s\n%s\n",p1,p2); //字符串输出
printf("%c\n%c",*p1,*p2); //字符输出
printf("实验结束\n");
system("pause");
printf("实验二 good\n"); //分别比较 字符指针 常量 和 变量 的地址
system("pause");
char buf3[] = "good"; //字符指针变量
char* p3 = buf3;
char* p4 = &buf3[1] - 1;
printf("%d\n", p3 - p4); //比较指向同一个字符变量
char* p5 = "good"; //字符指针常量
char* p6 = "good";
printf("%d\n", p5 - p6); //比较指向同一个字符常量
printf("实验结束\n");
system("pause");
}
运行结果
其中,字符数组的字符串输出,由于找不到休止符,会输出一些乱码,如上图所示。