- const char *p
表示一个字节只读 ,p指向的空间只读,但是p可以指向其他内存。 - char const *p
一个字节只读 等价上一个 p 。前面是 *代表是指针变量,const 代表这个指针指向的不能变,char表示指向char类型。
const char *str = "hello world";
- char * const p
代表 p指针的指向不能变,但是指向的内存可以变。 - char *p const
等价上一个
char * const p = 0x0020000 // p只能指向某个固定的地址
- const char * const p; // 指向不能变 指向的内存也不能变
下面有一个小Demo
#include <stdio.h>
int main() {
const char *p = "hello world!"; // 双引号的数据存放在不可变的内存 所以加上const 当然可加可不加
char buf[] = {"hello world"}; // helloworld在栈,可变
buf[0] = 'a';
printf("buf is %s\n", buf);
const char buf2[] = {"hello world"}; // helloworld在栈,被const修饰不可变
// buf2[0] = 'a'; // 直接错误
printf("buf2 is %s\n", buf2);
}
对于字符串,存储在text区,代码段,可以使用size
命令查看可执行文件的text区的信息。
对于buf存储在stack,可读写,对于buf2,修改会在编译时期报错。
c语言中const全局变量存储在只读数据段,编译期最初将其保存在符号表中,第一次使用时为其分配内存,在程序结束时释放。
而const局部变量(局部变量就是在函数中定义的一个const变量,)存储在栈中,代码块结束时释放。
在c语言中可以通过指针对const局部变量进行修改,而不可以对const全局变量进行修改。因为const全局变量是存储在只读数据段


参考:https://blog.csdn.net/woainilixuhao/article/details/86521357
网友评论