zoukankan      html  css  js  c++  java
  • "Programming"和"Programming"是同一个"Programming"吗?

    什么意思?

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

    让我们来实践一下!

      首先我们先来看看代码:

     1 #include <stdio.h>
     2 
     3 #define STR "Programming"
     4 
     5 int main(void)
     6 {
     7     printf("STR %s (%p\n",STR,&STR);
     8     printf("!!! %s (%p\n","Programming","Programming");
     9     getch();
    10     return 0;
    11 }

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

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

     

      在Visual C++ 2010编译后:

     

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

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

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

      const char * pch 

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

  • 相关阅读:
    泛型理解及应用(二):使用泛型编写通用型Dao层
    泛型的理解及应用(一):泛型擦除
    Servlet、Filter 生命周期
    Java多线程(六) 线程系列总结
    Java多线程(五) Lock接口,ReentranctLock,ReentrantReadWriteLock
    Java多线程(四) 线程池
    Java多线程(三) 多线程间的基本通信
    Java多线程(二) 多线程的锁机制
    Java多线程(一) 多线程的基本使用
    Spring Boot实战:模板引擎
  • 原文地址:https://www.cnblogs.com/mrblug/p/5720843.html
Copyright © 2011-2022 走看看