【C语言基础】指向字符串的指针 & 字符串常量指针的关系

发布时间 2023-10-20 14:33:09作者: FBshark

问:指向字符串的指针 与 字符串常量指针有什么区别?

答:经过实践 指向字符串的指针 就是字符串常量指针。

字符串常量指针是常量指针的一种。常量指针的特点就是不能通过该指针来修改指向内存地址空间存储的值。

 

问:

来看一下常见面试题

char *p = “abcd”;
*p = ‘b’;
printf("%c\n", p[0]);

以上代码有什么问题?

答:

首先,编译器在常量区保存一个字符串abcd,其内容不许修改。
char *p = “abcd”; // p是一个指针,直接指向常量区,修改p[0]就是修改常量区的内容,这是不允许的。这正是常量指针的特点。

这里指针p就是一个常量指针,更具体一点说就是字符串常量指针。
"abcd"这个字符串程序没有给它分配空间,编译器把它分配到常量区,即全局(静态)变量区。

而以下通过数组的形式定义的,则是可以修改的。

char p[] = “abcd”; // 编译器在栈上创建一个字符串p,把abcd从常量区复制到p,修改p[0]就是修改一个局部变量,这是允许的。

 

测试代码:

 1 #include<iostream>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     
 7     char a[] = "hello";
 8     a[0] = 'X'; //正常运行
 9 
10     char *p = "world"; // 注意p 指向常量字符串, 这里p就  相当于  常量指针
11     //p[0]= 'x';   //编译不会报错,但是运行会报错,因为不允许通过指针来修改指针p指向内存空间存储的值
12 
13     return 0;
14 }