我们先来看如下代码:
![](https://i-blog.csdnimg.cn/blog_migrate/8cbc633e3fccc899248e8cefd48d6f7b.png)
这段代码通过编译,我们觉得很正常因为,字符指针可以指向字符变量,但如果我们把变量a里面的单个字符换成一个字符串的时候,我们会发现编译依然通过。
这说明字符指针不仅可以指向字符,而且也可以指向一个字符串。其本质都是指向字符串第一个元素的地址。
但是我们能不能通过指针对指向的内容进修修改呢?
![](https://i-blog.csdnimg.cn/blog_migrate/cdcf041439539ec8eadec1f69293007c.png)
首先我们明确一点,p指针变量存放的不是字符串“abcdef”,而是存放a的首地址,然后我们通过指针去对‘a’进行修改会发现编译器报错
![](https://i-blog.csdnimg.cn/blog_migrate/bb50ebf45ef877b3539d3ccb92b36c6f.png)
这是因为:
字符串为常量字符串我们不能对其进行修改
![](https://i-blog.csdnimg.cn/blog_migrate/0246e6e1260eb838d3c0f53c007e09aa.png)
但是我们却可以修改数组中的字符串,因为数组中的字符串不属于常量字符串
![](https://i-blog.csdnimg.cn/blog_migrate/49e60e83357f1c492314a5686f1b0070.png)
为了了解字符指针与字符数组之间的关系我们看如下代码猜想一下结果会是什么:
![](https://i-blog.csdnimg.cn/blog_migrate/99380858177bc1c9a6e0ce80f22f9424.png)
这是运行后的结果:
![](https://i-blog.csdnimg.cn/blog_migrate/7e1e9d831748c7b7f1bf2a32804154f6.png)
我们先来分析数组:
![](https://i-blog.csdnimg.cn/blog_migrate/39f97fe1ee6d98bb636fd3fba73ecac1.png)
既然是两个不同的数组,那么在内存中肯定不在同一个位置。然后数组名为首元素地址,所以str1与str2地址不相同。
接着我们来看用指针直接指向一个相同的字符串:
![](https://i-blog.csdnimg.cn/blog_migrate/fdedb317930bfcd1abd220a94f4248cf.png)
我们知道等号右边的为常量字符串,不能被修改,既然不能被修改,对于同一个内容,那我有必要存两份吗?
答案是不需要!
所以我们str3与str4指向的是同一个“hello world”,所以两者地址相同。
总结:字符串指针既可以指向一个字符又可以指向一个字符串,本质上都是指向两者第一个字符的首地址,他们直接所指向的字符串为常量字符串,不可以被修改,所以当两个指针所指向同一个字符串的时候,他们地址相同。