什么意思?

  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

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

"Programming"和"Programming"是同一个"Programming"吗?的更多相关文章

  1. Programming Series 1.0 — C Programming

    In the growing world of technology, C programming has kind of lost its way. Today, we have a million ...

  2. 【离散化树状数组】Nordic Collegiate Programming Contest G.Galactic Collegiate Programming Contest

    #include<bits/stdc++.h> using namespace std; typedef long long ll; int n,m; ; struct node { in ...

  3. 游戏编程算法与技巧 Game Programming Algorithms and Techniques (Sanjay Madhav 著)

    http://gamealgorithms.net 第1章 游戏编程概述 (已看) 第2章 2D图形 (已看) 第3章 游戏中的线性代数 (已看) 第4章 3D图形 (已看) 第5章 游戏输入 (已看 ...

  4. Language Oriented Programming:下一代编程样式 Part I (翻译)

    原文信息 原文地址 作者信息 Sergey Dmitriev JetBrains Sergey Dmitriev is the cofounder and CEO of JetBrains Inc., ...

  5. Teach Yourself Programming in Ten Years

    Teach Yourself Programming in Ten Years——用十年教会自己编程 作者:Peter Norvig 译者:刘海粟 本文原文为:http://norvig.com/21 ...

  6. [iOS翻译]《iOS 7 Programming Pushing the Limits》系列:你可能不知道的Objective-C技巧

    简介: 如果你阅读这本书,你可能已经牢牢掌握iOS开发的基础,但这里有一些小特点和实践是许多开发者并不熟悉的,甚至有数年经验的开发者也是.在这一章里,你会学到一些很重要的开发技巧,但这仍远远不够,你还 ...

  7. Questions that are independent of programming language. These questions are typically more abstract than other categories.

    Questions that are independent of programming language.  These questions are typically more abstract ...

  8. Coursera课程 Programming Languages 总结

    课程 Programming Languages, Part A Programming Languages, Part B Programming Languages, Part C CSE341: ...

  9. Reactive Programming

    Reactive的表现 Reactive 规范是 JVM Reactive 扩展规范 Reactive Streams JVM,而 Reactive 实现框架则是最典型的实现: Reactive St ...

随机推荐

  1. C++历史(The History of C++)

    C++历史 早期C++ •1979: 首次实现引入类的C(C with Classes first implemented) 1.新特性:类.成员函数.继承类.独立编译.公共和私有访问控制.友元.函数 ...

  2. SDUT 3345 数据结构实验之二叉树六:哈夫曼编码

    数据结构实验之二叉树六:哈夫曼编码 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 字符的编 ...

  3. 【练习】如何显示本地主机上的MySQL客户机版本

    在终端窗口以oracle用户身份登录 [root@enmo ~]# su - oracle [oracle@enmo ~]$ mysql -V mysql Ver , for Linux (x86_6 ...

  4. JS获取当前文件所在的文件夹全路径

    var js = document.scripts; js = js[js.length - 1].src.substring(0, js[js.length - 1].src.lastIndexOf ...

  5. 学习总结 html图片热点,网页划区,拼接,表单

    表单: action="负责处理的 <form id="" name="" method="post/get"服务端&quo ...

  6. CHARINDEX用法

    CHARINDEX返回字符串中指定表达式的起始位置. 语法CHARINDEX ( e­xpression1 , e­xpression2 [ , start_location ] ) 参数e­xpre ...

  7. JavaScript设计模式

    -->面向对象中的23种设计模式简介 最近看了一本书,推荐给大家<JavaScript设计模式与开发实践>图灵出版社的,讲的非常棒! 详细讲解了js开发中常用的14种设计模式,有很多 ...

  8. WWF3事务和异常处理类型活动<第四篇>

    一.FaultHandler 添加一个工作流图如下: 首先添加一个Seruence,在里面添加3个Code,外面添加一个Code,打开Seruence错误处理,在容器里添加一个faultHandler ...

  9. docker1.12在cento7里的跨多主机容器网络

    docker1.12在cento7里的跨多主机容器网络

  10. 【MySQL】MySQL索引背后的之使用策略及优化【转】

    转自:http://database.ctocio.com.cn/353/11664853.shtml 另外很不错的对于索引及索引优化的文章: http://www.cnblogs.com/magia ...