• "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 

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

  • 相关阅读:
    设计模式(5)>模板方法
    设计模式(2)>工厂方法模式
    分支限界>装载问题
    解决Oracle 11g在用EXP导出时,空表不能导出
    设计模式(7)>观察者模式
    算法>并行算法
    设计模式(15)>桥接模式
    设计模式(9)>迭代器模式
    设计模式(11)>建造者模式
    设计模式(17)>中介者模式
  • 原文地址:https://www.cnblogs.com/mrblug/p/5720843.html
Copyright © 2020-2023  润新知