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 

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

  • 相关阅读:
    3月3日(6) Climbing Stairs
    testNG 预期异常、忽略测试、超时测试
    testNG 常用的注解
    testNG 下载安装
    selenium 执行js代码
    selenium 时间等待的方法
    selenium 文件上传
    selenium 键盘鼠标模拟
    selenium 窗口的切换
    selemiun 下拉菜单、复选框、弹框定位识别
  • 原文地址:https://www.cnblogs.com/mrblug/p/5720843.html
Copyright © 2011-2022 走看看