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