什么意思?

  C语言没有专门的字符串类型,但是,它同样可以处理字符串。本文不是讨论字符串的使用,而是讨论C字符串之间的关系。如题,在C语言代码中,如果定义#define STR = "Programming",然后再用printf("%s","Programming");试问,这两个"Programming"有什么共同之处?初学者可能就认为这只是内容一样。其实,这么说来也没错,但是它们还有别的“不可告人的秘密”,到底是什么呢?

让我们来实践一下!

  首先我们先来看看代码:

 #include <stdio.h>

 #define STR "Programming"

 int main(void)
{
printf("STR %s (%p\n",STR,&STR);
printf("!!! %s (%p\n","Programming","Programming");
getch();
return ;
}

  %p代表输出指针的内容(地址),如果编译器不支持%p,请换成%u,%lu或%#x。

  这段代码在TDM-GCC 4.8.1 编译后运行:

 

  在Visual C++ 2010编译后:

 

从这个示例我们得到什么?

  示例中我们可以看出,两个字符串的地址竟然相同!!!我的看法是:编译器这样做是为了节约内存空间。C Primer Plus对这的看法是:“编译器可以把多次使用的相同字面量(常量)储存在一处或多处”。可以肯定的是,现在大多数的编译器都支持把它们存储在一处。上面的代码在另一台计算机中用TC编译之后,结果也是地址相同。可能很早以前就有这种功能了,因为当时的内存容量很小。

  这样就说明一个问题:如果在操作字符串常量时使用指针,那么用指针更改字符串时就会导致其他相同的字符串也改变,因为指针只保存地址,不拷贝内容,操作的是静态存储区的字符串。所以,C Primer Plus建议大家使用数组对字符串进行处理,因为数组使用动态存储空间,它拷贝了原来在静态存储区的字符串。如果一定要用指针对字符串常量进行处理,推荐这样声名:

  const char * pch

防止更改不应该更改的内容。

最新文章

  1. Ubuntu下freeradius-server的安装与mysql-server的关联
  2. 了解 XSS 攻击原理
  3. SQL中对XML的处理
  4. 客户端动态调用cxf websevice 异常
  5. STM32片上Flash内存映射、页面大小、寄存器映射
  6. SysLog简介和java操作实例
  7. python+eclipse+pydev开发环境搭建
  8. Django 系列博客(十一)
  9. Linux 安装zabbix
  10. qml Loader异步导致ComBoBox数据乱序
  11. yii2 数据提供者 dataProvider
  12. GitHub学习总结
  13. SpringMvc配置扫包之后,访问路径404问题解决
  14. kafka性能测试1.0.0
  15. 八、自定义starter
  16. Laravel 5 中使用 JWT(Json Web Token) 实现基于API的用户认证
  17. 基于OpenGL编写一个简易的2D渲染框架-03 渲染基本几何图形
  18. CAN网要不要共地?
  19. Spring Boot 集成 MyBatis和 SQL Server实践
  20. CentOS运行级别和开机过程

热门文章

  1. 安装Oracle软件
  2. 能在手机播放的Flash代码
  3. 在使用 百度编辑器 Ueditor 时,不能进入 Controller 相应的 Action 的处理方法
  4. django中时区设置
  5. ant风格是什么?
  6. Windows Server 2012下安装Hyper-V虚拟机
  7. grep使用
  8. centos7 docker1.12 私有仓库
  9. Handler 取不到session 解决办法
  10. (笔记)angular 包含关系的controller参数父级方法