C 字符串常量
Posted reborn521615
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了 C 字符串常量相关的知识,希望对你有一定的参考价值。
当一个字符串常量出现在表达式中时,它的值是个指针常量。编译器把这些指定字符的一份拷贝存储在内存的某个位置,并存储一个指向第一个字符的指针。但是,当数组名用于表达式中时,它们的值也是个指针常量。我们可以对它们进行下标引用、间接访问以及指针运算。
这些操作对于字符串常量是不是也有意义呢?
看看下面这个表达式是什么意思?
看上去像是一个垃圾!它好像是试图在一个字符串上面执行某种类型的加法运算。
但是,当你记得字符串常量实际上是一个指针常量时,它的意义就变得清楚了。这个表达式计算“指针值 + 1”的值。它的结果是个指针,指向字符串的第二个字符:y。
那么这个表达式又是什么呢?
理解了第一个,后面的都好说:对一个指针执行间接访问时,其结果就是该指针指向的值。字符串常量的类型是指向字符的指针,所以这个间接访问得到的结果是字符‘x’。
我们继续放出大招:
很简单,对一个指针进行下标访问是合理的,就像数组名也是一个指针常量,对其下标访问就是对数组中的元素进行访问,这个同理,表达式的值为一个字符‘z’。
下面给出一个错误的例子:
这个表达式的结果是什么呢?
事实上,这是一个错误,它的偏移量4超过了字符串的访问,就像你访问一个数组的元素,超出了索引范围一样,这样有可能会出大事!这个表达式的结果是一个不可预测的值。
什么时候会用到类似这些形式的表达式呢?
《C与指针》给出了一个神秘函数的例子:
最后一个标准输出语句使用了字符串常量,下面我们测试下这个函数执行的情况:
我们通过改变M的值,来运行这个程序:
大家可在这个网站上实验:https://www.tutorialspoint.com/compile_c_online.php
当输入M = 10 时候:
输入M = 100时:
各位自行总结规律!
各位大侠如果觉得这个例子垃圾,那我们就再看一个例子:
这个例子在递归函数中也见过,非常好玩!
贴出来代码:
这个例子,如果你不太了解递归函数,恐怕会感到无解!
但它确实能实现把一个整型值转换为字符打印的操作。
测试下呗:
下面我们对这个例子进行修改,以十六进制的形式打印结果值:
这就很完美了,成功的运用了字符串常量是一个指针常量的意义来设计程序!
当然,如果觉得字符串常量难以理解的话,可以有一个简单的替代方案,但是代码没有字符串常量简洁:
以上是关于 C 字符串常量的主要内容,如果未能解决你的问题,请参考以下文章
C ++ - 从字符串常量到'char *'的不推荐转换[重复]
C 语言内存四区原理 ( 常量区示例 | 不同函数返回的相同字符串的指针地址相同 )
14.VisualVM使用详解15.VisualVM堆查看器使用的内存不足19.class文件--文件结构--魔数20.文件结构--常量池21.文件结构访问标志(2个字节)22.类加载机制概(代码片段