当一个字符串常量出现在表达式中时,它的值是个指针常量。编译器把这些指定字符的一份拷贝存储在内存的某个位置,并存储一个指向第一个字符的指针。但是,当数组名用于表达式中时,它们的值也是个指针常量。我们可以对它们进行下标引用、间接访问以及指针运算。

这些操作对于字符串常量是不是也有意义呢?

看看下面这个表达式是什么意思?

"xyz" + 1

看上去像是一个垃圾!它好像是试图在一个字符串上面执行某种类型的加法运算。

但是,当你记得字符串常量实际上是一个指针常量时,它的意义就变得清楚了。这个表达式计算“指针值 + 1”的值。它的结果是个指针,指向字符串的第二个字符:y。

那么这个表达式又是什么呢?

*"xyz"

理解了第一个,后面的都好说:对一个指针执行间接访问时,其结果就是该指针指向的值。字符串常量的类型是指向字符的指针,所以这个间接访问得到的结果是字符‘x’。

我们继续放出大招:

"xyz"[2]

很简单,对一个指针进行下标访问是合理的,就像数组名也是一个指针常量,对其下标访问就是对数组中的元素进行访问,这个同理,表达式的值为一个字符‘z’。

下面给出一个错误的例子:

*( "xyz" + 4 )

这个表达式的结果是什么呢?

事实上,这是一个错误,它的偏移量4超过了字符串的访问,就像你访问一个数组的元素,超出了索引范围一样,这样有可能会出大事!这个表达式的结果是一个不可预测的值。

什么时候会用到类似这些形式的表达式呢?

《C与指针》给出了一个神秘函数的例子:

#include <stdio.h>void mystery( int n )
{n += 5;n /= 10;printf("%s\n", "**********" + 10 - n );
}

最后一个标准输出语句使用了字符串常量,下面我们测试下这个函数执行的情况:

#include <stdio.h>
#define M 6void mystery( int n )
{n += 5;n /= 10;printf("%s\n", "**********" + 10 - n );
}int main()
{mystery( M );return 0;
}

我们通过改变M的值,来运行这个程序:

大家可在这个网站上实验:https://www.tutorialspoint.com/compile_c_online.php

当输入M = 10 时候:

输入M = 100时:

各位自行总结规律!
各位大侠如果觉得这个例子垃圾,那我们就再看一个例子:

这个例子在递归函数中也见过,非常好玩!

【 C 】深入了解递归

贴出来代码:

//接受一个整型值(无符号),把它转换为字符并打印它。#include <stdio.h>void binary_to_ascii(unsigned int value)
{unsigned int quotient;quotient = value / 10;if(quotient != 0)binary_to_ascii(quotient);putchar(value % 10 + '0');}

这个例子,如果你不太了解递归函数,恐怕会感到无解!

但它确实能实现把一个整型值转换为字符打印的操作。

测试下呗:

//接受一个整型值(无符号),把它转换为字符并打印它。#include <stdio.h>void binary_to_ascii(unsigned int value)
{unsigned int quotient;quotient = value / 10;if(quotient != 0)binary_to_ascii(quotient);putchar(value % 10 + '0');}int main()
{binary_to_ascii(16);return 0;
}

下面我们对这个例子进行修改,以十六进制的形式打印结果值:

//接受一个整型值(无符号),把它转换为字符并打印它。#include <stdio.h>void binary_to_ascii(unsigned int value)
{unsigned int quotient;quotient = value / 16;if(quotient != 0)binary_to_ascii(quotient);putchar( "0123456789ABCDEF"[value % 16] );}int main()
{binary_to_ascii(26);return 0;
}

这就很完美了,成功的运用了字符串常量是一个指针常量的意义来设计程序!

当然,如果觉得字符串常量难以理解的话,可以有一个简单的替代方案,但是代码没有字符串常量简洁:

//接受一个整型值(无符号),把它转换为字符并打印它。#include <stdio.h>void binary_to_ascii(unsigned int value)
{unsigned int quotient, remainder;quotient = value / 16;if(quotient != 0)binary_to_ascii(quotient);remainder = value % 16;if( remainder < 10 )putchar( remainder + '0' );elseputchar( remainder - 10 + 'A' );}int main()
{binary_to_ascii(26);return 0;
}

【 C 】彻底学会字符串常量相关推荐

  1. python字符串常量_python教程---字符串常量ascii_letters、punctuation、digits、whitespace等...

    字符串常量 此模块中定义的常量为: string.ascii_letters 下文所述 ascii_lowercase 和 ascii_uppercase 常量的拼连. 该值不依赖于语言区域. str ...

  2. 关于C语言中 字符串常量的问题

    昨天晚上我编写了一段简短的C语言程序(Linux环境下),编译能够通过,但是运行的时候老是报段错误.我当时非常郁闷,因为代码不长.其中主函数中有这样一句话: char *str="epmzm ...

  3. JVM---StringTable(字符串常量池)

    StringTable(字符串常量池) 字符串常量池 StringTable(字符串常量池) String的基本特性 String 的底层结构 String 的内存分配 String 的基本操作 字符 ...

  4. Java的字符串常量池

    字符串对象创建过程 先看一道面试题 // 这段代码创建了几个对象? String s = new String("卓卓"); 使用new关键字创建对象时,Java虚拟机会先在字符串 ...

  5. 字符串常量是一个字符数组

    1 #include<iostream>2 using namespace std;3 4 int main()5 {6 char var = '5';7 char *p_var;8 p_ ...

  6. 【 C 】关于相邻字符串常量自动合并的标准(新旧标准)(新旧风格)(陷阱)

    如果一个字符串太长了,我们需要把它分行来写,旧式风格是这样来做的: 1 #include<stdio.h>2 #include<stdlib.h>3 int main()4 { ...

  7. java 常量字符串过长_90%的同学都没搞清楚的 Java 字符串常量池问题(图文并茂)

    字符串问题可谓是 Java 中经久不衰的问题,尤其是字符串常量池经常作为面试题出现.可即便是看似简单而又经常被提起的问题,还是有好多同学一知半解,看上去懂了,仔细分析起来却又发现不太明白. 背景说明 ...

  8. 读取字符串字符时出错_JVM | 运行时常量池和字符串常量池及intern()

    本文知识点 这一块的知识点,一直都是最为混乱的,网上很多博客有的都自相矛盾,因此,这一块需要深入学习,本文以JDK11为基础,尽量参考官方文档 静态常量池 运行时常量池及字符串的引用 各种String ...

  9. C语言中关于字符串常量的进一步分析 转

    请在(且只能在TC2.0)中运行下面代码,先不要看结果,想想会得到什么: #include<stdio.h> #include<stdlib.h>// 文章要求代码在Tc下运行 ...

最新文章

  1. Matlab并行编程方法1
  2. 从外卖员到程序员,自学3年终于转行成功,三面“拿下”拼多多,把经历分享给你们!
  3. HTML5托拽上传(XMLHttpRequest和Google Gears)
  4. python语法(二)——截取字符串的方法详解
  5. PAT甲级 1017 Queueing at Bank
  6. 简单理解const是锁还是不锁!
  7. C# word 转 pdf
  8. Abp框架多租户源码解读
  9. 华为手机解锁码计算工具_华为高通全系列手机解锁工具
  10. To analyze love in women’s kingdom of the Journey to the West
  11. 玩转无线路由之DD-WRT基础扫盲
  12. 2017年6月大学英语六级真题(第一套)阅读理解(一)(每日一摸)
  13. 向家坝水电站蓄水第五天老屏山县城没入金沙江-老屏山-水电站
  14. python实现视频音频同步
  15. 优秀IT顾问的七大能力之七--持续战斗能力
  16. 二元函数对xy同时求导_复变函数(1)——解析与保角,导数的几何意义,柯西-黎曼方程...
  17. 新品周刊 | 可口可乐与时尚包袋品牌Kipling推出联名系列;阿迪达斯推出电竞灵感跑鞋...
  18. python怎么清除代码_python的shell中的代码怎么清理?
  19. 国内物联网平台(5):机智云IoT物联网云服务平台及智能硬件自助开发平台
  20. Django部署深度学习项目-1

热门文章

  1. c语言dp状态转移方程,[总结-动态规划]经典DP状态设定和转移方程
  2. mysql5.7版本中的命令_mysql (5.7版本)---的配置
  3. 数据仓库中宽表的设计原则_实际项目中交互设计原则的运用
  4. java开发经验分享_java开发经验分享(一)
  5. 数组中查找並返回数组_用Python查找数组中出现奇数次的那个数字
  6. 脉冲20KV高压发生器电弧打火
  7. 2021年春季学期-信号与系统-第十四次作业参考答案-第七小题参考答案
  8. 基于ATMEGA8的Arduino Nano(UNO)开发板
  9. 实验研究信标无线电能输出功率的因素
  10. 100W无线电耦合功率测试实验