前言
本文主要介绍C语言字符指针的一些特殊的地方,内容较少,希望对大家有所帮助。
一、字符指针
在C语言指针类型中,我们知道有一种字符指针,一般写为char*
一般用法:
另一种用法:
这种用法是将双引号括起来的字符串的首个字符的地址传给指针变量
这种用法有以下需要注意的点:
- 这种双引号括起来的字符串被称为字符串字面量,被创建时它有着自己单独的存储区域,储存在静态存储区或常量区,这意味着字符串字面量的生命周期与程序的运行期相同,而且在整个程序执行期间内它是保持不变的
- 这种字符串字面量是存储在程序的只读内存区域,这表明字符串字面量是不允许被修改的,强制修改可能导致程序崩溃、数据损坏或其他不可预料的后果,因此一般使用const 修饰的字符指针变量接收
- 由于这种字符串字面量在内存中有着自己的地址,因此多个指针变量接收这个字符串,指向的都是同一区域,也就是指针变量存储的地址都是一样的
- 如果需要修改字符串,可以使用字符数组接收字符串,以此将其复制到可写的内存区域
二、练习题,出自《剑指offer》
提问:最终打印的结果是什么?
#include <stdio.h>
int main()
{
char str1[] = "hello world.";
char str2[] = "hello world.";
const char* str3 = "hello world.";
const char* str4 = "hello world.";
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为字符数组,它们在创建时被分配的内存空间是不一样的,也就是地址不一样,两数组名就是它们各自的首元素地址,因此肯定不相等
- 而指针变量就不一样,它们的变量名是它们存储的地址,而str3,str4就是存储的"hello world"字符串字面量的首个字符的地址,因此str3和str4就相等了
运行结果: