C 字符串指针与字符串数组
在程序中定义的字符串无论是对于字符串指针还是字符串数组,都会将字符串放到静态存储区
在程序开始运行的时候,对于数组来说,先分配内存空间,然后静态存储区中的字符串字面量将拷贝到字符串数组中,而对于字符串指针来说,这个指针将直接指向静态存储区中的字符串常量地址,而且对于同一个字符串字面量,编译器只会在静态存储中存储一次。下面我们打印一下字符串字面量的地址。
对于双引号引起来的字符串字面量就是一个地址,可以看到str指向的地址和"hello world"的地址是相同的,都是在静态存储区中的一个形同的地址,而对于数组来说,由于是重新在内存上开辟了一个地方,所以也就是说字符串的数组是与其他两个不同的。
字符串字面量是一个常量,也就是说他是const修饰的,也就是说任何指向字符串字面量的指针都无法通过解引用来改变字符串字面量的值,他修改的结果将会是未定义的,换句话说就是不能进行*str='q'这种操作,但是数组的元素是变量,可以改变(array[2]='q' ✅)。那我们就是想通过字符串指针修改会怎么样呢,看看下面的情况。
对于我当前的环境是什么输出都没有的,因为编译器可以使用内存中的一个副本来表示所有完全相同的字符串面量(单次副本表示法)。也就是说编译器可以用相同的地址替换每一个"hello world"实例,如果修改了将会影响到所有使用该字符串的代码,结果是未定义的。
因此推荐在使用指针指向字符串面量的时候应该使用const修饰符,
const char* p1 = "hello world";
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话