什么意思?

  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. 如何在 Git 里撤销(几乎)任何操作

    任何版本控制系统的一个最有的用特性就是“撤销 (undo)”你的错误操作的能力.在 Git 里,“撤销” 蕴含了不少略有差别的功能. 当你进行一次新的提交的时候,Git 会保存你代码库在那个特定时间点 ...

  2. Django基础篇之数据库选择及相关操作

    在djanjo框架中我们最常用的框架分别就是mysql和sqlit了,下面我们将分别讲述一下这俩种数据库的基础必备知识 mysql 一.利用命令创建(在终端上执行) 1.首先创建一个project项目 ...

  3. 启动obiee

    启动obiee:1.启动数据库第一步:打开Oracle监听$ lsnrctl start第二步:使用sysdab角色登录sqlplussqlplus / as sysdba第三步:启动数据库SQL&g ...

  4. html中button的type属性

         接触web开发不久,今天遇到了一个问题,点击button按钮,浏览器没有反应,尝试了自己可以想到的所有办法,还是无果.只得请教他人,才发现是button的type属性搞得怪,原来:     ...

  5. SVN与TortoiseSVN实战:属性的奇技淫巧(一)

    硬广:<SVN与TortoiseSVN实战>系列已经写了六篇,本系列结合TortoiseSVN对SVN中容易被忽视的部分进行了详解,预计再用三.四篇来结束这个系列. 本篇详解一下SVN的属 ...

  6. Exceeded maximum number of retries. Exceeded max scheduling attempts 3 for instance 7d90eb80-29e2-4238-b658-ade407ff9456. Last exception: [u'Traceback (most recent call last):\n', u' File "/usr/lib/py

    Exceeded maximum number of retries. Exceeded max scheduling attempts 3 for instance 7d90eb80-29e2-42 ...

  7. C# 发送邮件方法2

    一. 发送邮件程序:(使用System.Web.Mail下的类) "; //SMTP服务密码 strFrom = "jailu@163.com"; //发送方邮件地址 C ...

  8. TP-Link访问策略

    参考资料: http://service.tp-link.com.cn/detail_article_111.html

  9. 1.3查看Linux内核版本

    1.目前Linux内核主要维护的三个版本:Linux2.4.Linux2.6和Linux3.x,Android使用的是Linux2.6:Linux3.x是最新推出的Linux内核版本: 2.查看Lin ...

  10. Linux系统在嵌入式硬件上的移植

    =========================        基本常识       ========================= 一. Linux系统的基本构成: 1. loader 2.  ...