C陷阱(二)

来源:互联网 发布:hdfs 元数据大小 编辑:程序博客网 时间:2024/05/18 02:31

trap 2,关于字符串变量和字符串常量

 

先看看下面这些断码的运行结果:

  char str1[]             = "abc";

  char str2[]             = "abc";

  const char str3[]    = "abc";

  const char str4[]    = "abc";

  const char* str5     = "abc";

  const char* str6     = "abc";

  char *str7              = "abc";

  char *str8              = "abc";

  char *const str9     = "abc";

  char *const str10   = "abc";

 

  bool b1 = (str1==str2);          // = 0

  bool b2 = (str3==str4);          // = 0

 

  bool b3 = (str5==str6);          // =1

  bool b4 = (str7==str8);          // =1

  bool b5 = (str5==str8);          // =1

 

  bool b6 = (str9==str10);        // =1

  bool b7 = (str5==str10);        // =1

  strcpy(str7, "ef");                   //运行时错误

  运行发现str5 == str6 == str7 == str8 == str9 == str10,我们知道,全局变量都在编译的时候被放在静态存储区域了,他们在执行影响载入内存是就被确定的分配空间了。而在这里,可以看到,常量字符串“abc”也被放在了静态区域,所有由此串初始化的所有指针变量都会指向该静态区域,也就是所有指针变量的值是一样的。另外也可以看到,这些指针是没有存储空间的他们仅仅指向静态区域的模块内存,所以一旦给其赋值就会出现运行错误。

 

==============================================================

另外的一些引申:

关于const的用意,其准确的含义是表示read only。那可以修饰变量,也可以修饰函数参数,还可以修饰函数,看下面的一些例子:

 

char t1 = 31;

char t2 = 32;

const char *p1 = &t1;          //一个指向常量字符的指针

char const *p2 = &t1;          //同上

char * const p3 = &t1;         //一个指向字符的常量指针

const char const * p4 = &t1;   //一个指向常量字符的指针

char const * const p5 = &t1;   //一个指向常量字符的常量指针

const char * const p6 = &t1;   //同上

*p1 = 33;       //编译错误

p1 = &t2; 

*p2 = 33;       //编译错误

p2 = &t2;

*p3 = 33;

p3 = &t2;       //编译错误

*p4 = 33;       //编译错误

p4 = &t2;

*p5 = 33;       //编译错误

p5 = &t2;       //编译错误

*p6 = 33;       //编译错误

p6 = &t2;       //编译错误

 

==============================================================

关于引申的延伸:

下面这些定义能够看代码的灵活性,这也是一件很麻烦的事情,实际上这些东西很少在实际中用到。

    a) int a;            // An integer

    b) int *a;          // A pointer to an integer

    c) int **a;         // A pointer to a pointer to an integer

    d) int a[10];     // An array of 10 integers

    e) int *a[10];    // An array of 10 pointers to integers

    f) int (*a)[10];   // A pointer to an array of 10 integers

     g) int (*a)(int);          // A pointer to a function a that takes an integer argument and returns an integer

     h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer

 

 

 

 

 

原创粉丝点击