理解c语言中的const指针

Published on June 21, 2024

const指针分为两种情况:

  • const 变量类型 * 变量名
  • 变量类型 * const 变量名

但是需要理解 const 指针,首先得先弄清楚啥是指针。以 char * s 为例,表示s指向一个字符变量的地址,换个易于理解的方式就是 s 这个变量存储了某个字符变量的地址。 以一个例子为例:

char * s = helloworld\n;

其中 s 存储了 "hello,world\n" 这个字符串的首地址,即字符 'h' 的地址。

那么,现在我们理解了指针后,我们可以进行逻辑推导来理解const指针。 我们需要知道 const 限定什么,比方说 const 限定整个创建指针的语句即 变量类型 * 变量名 ,例如 const char * s :

那么我们可以进行以下的推导理解:

\(\because\) char * s = “hello,world\n”

又 \(\because s \rightarrow\) 'h'.

\(\therefore\) const char * s \(\rightarrow\) const 'h'

const 'h' 表示什么意思呢?其实就是说 'h' 不能改变了。所以 const char * s 的意思就是说,s 指向的地址所表示的内容不能改变。但是变量 s 的内容可以发生改变,也就是说 s 可以指向别的地址。 当然了,我现在这样进行逻辑上的推理,只是推理,不是实际编译的情况,也不是合理的语法,只是有助于理解。

现在我们同样按照这个思路分析 变量类型 * const 变量名 。现在我们举个实际的例子:

char * const s = helloworld\n;

现在 const 限定 s, 而 s 是什么呢? s 用于保存字面量 "hello,world\n"'h' 的地址,所以现在 s 不能发生改变了,也就是说 s 无法更换存储的内容了,所以 s 被强行锁定了只能指向 'h' 的地址。但是指向的地址所存储的内容却可以发生改变。

最后用图例进一步生动说明:

  • const 变量类型 * 变量名 : 地址1234指向的4567地址所在的变量所存储的 'h' 字符不可以发生改动,但是地址1234存储的内容4567可以发生改变
  • 变量类型 * const 变量名: 地址1234内存储的4567不能发生任何变化,但是4567这个地址上保存的字符'h'可以发生变化
Alt text

好了今天的 const 指针的内容就分享到这了。非常感谢你的阅读,鄙人才疏学浅,若有错误,请联系我的邮箱。