1. 字符指针变量
可以利用字符指针存放字符数组来间接存放字符串。
int main()
{char arr[10] = "abcdef";char* p = arr;printf("p = %s\n", p);return 0;
}
那我们可不可以直接给字符指针存放字符串呢?
int main()
{char* p1 = "abcdef";printf("p1 = %s\n", p1);return 0;
}
我们来看一下结果:
可以看到是可以直接给字符指针存放字符串,其实指针仅仅存放了字符串首字母的地址,%s会根据这个首字母的地址依次打印字符,当遇到空字符‘\0’则会停止打印,从而打印出了完整的字符串。
字符指针存放字符数组的字符串可修改,而存放字符串字面量不可修改,因为
- 当字符指针指向一个字符数组时,该数组通常在栈上或堆上分配内存空间,这块内存是可以被修改的。
- 当字符指针直接指向一个字符串字面量时,该字面量通常存储在程序的只读数据段,这部分内存是不可以修改的。
《剑指offer》中收录了⼀道和字符串相关的笔试题,我们⼀起来学习⼀下:
#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");elseprintf("str1 and str2 are not same\n");if (str3 == str4)printf("str3 and str4 are same\n");elseprintf("str3 and str4 are not same\n");return 0;
}
先来看str1和str2,在一篇文章中已经讲过数组名是数组首元素的地址,所以str1和str2分别是数组str1[]和数组的str2[]的首地址,而两个不同的数组是不会存放在同一个位置的,所以str1和str2是不相等的。
再来看str3和str4,str3和str4都是存放常量字符串的首地址,而当字符指针直接指向一个字符串字面量时,该字面量通常存储在程序的只读数据段,在只读数据段中是不会开辟两个空间存放相同的字面量的,也就是说*str3和*str4指向的"hello bit."是同一个字符串,所以str3和str4存放的地址是相同的。