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
- C陷阱(二)
- C陷阱与缺陷(二)----------------------语义“陷阱”
- C陷阱与缺陷(二)语法"陷阱"
- C缺陷与陷阱点滴(二)
- 读C陷阱与缺陷(二)
- C陷阱与缺陷(二)
- 囫囵C语言(二):陷阱,中断和异常
- 20100527--C陷阱与缺陷读书笔记(一、二章)
- 《C陷阱与缺陷》学习笔记(二)
- 《C陷阱与缺陷》学习笔记(二)
- C++,那些可爱的小陷阱(二)
- Java陷阱(二)
- C陷阱与缺陷二.1
- C陷阱与缺陷二.2
- 《C陷阱与缺陷》整理二
- 【C语言探索之二】内存陷阱
- C语言(思维陷阱)
- C“陷阱”
- Silverlight3的7个新功能
- hibernat 3.0 在myeclipse下映射表时总是报错的解决方法
- Pebble 开源的博客
- 戒指的带法
- 存储过程入门教程
- C陷阱(二)
- 数据库设计三大范式应用实例剖析
- Linux学习笔记(5)----在Ubuntu下架设telnet server
- RDLC子报表的备忘录
- 什么是C/S和B/S结构?
- DevExpress
- windows中movie播放
- 电脑DVD光驱变成CD光驱的解决方法
- 用有厘头的文字说无厘头的事