提取《你必须知道的495个C语言问题》一书中的个人要点
来源:互联网 发布:mac开发人工智能软件 编辑:程序博客网 时间:2024/05/21 20:29
前言
阅读《你必须知道的495个C语言问题》一书的过程中,提取自己在认知上有误的地方,以及个人要点等相关知识点,便于加深记忆与日后查阅。
1.24 一个文件中定义一个extern数组,然后在另外一个文件中使用:
file1.c : int array[] = {1,2,3};file2.c : extern int array[];
为什么在file2.c中,sizeof取不到array的大小?
答:未指定大小的extern数组是不完全类型。不能对它使用sizeof,因为sizeof在编译时发生作用,它不能获得定义在另一个文件中的数组的大小。
你有三种选择。
(1)在定义数组的文件中声明、定义并初始化一个变量,用来保存数组的大小:
file1.c : int array[] = {1,2,3}; int arraysz = sizeof(array); file2.c: extern int array[]; extern int arraysz;
(2)为数组大小定义一个明白无误的常量,以便在定义和extern声明中都可以一致地使用:
file.h #define ARRAY_SIZE 3file1.c : #include "file1.h" int array[] = {1,2,3}; file2.c: #include "file1.h" extern int array[ARRAY_SIZE];
(3) 在数组的最后一个元素放入“哨兵”值(通常是0、-1、NULL),这样代码不需要数组大小也可以确定数组的长度:
file1.c : int array[] = {1,2,3,-1}; file2.c: extern int array[];
扩展说明:来源于《C语言深度剖析》一书,抱歉,字太多,只好截图。
11.11 为什么不能向接受const char * * 的函数传入char * * ?
答:可以向接受const T的指针的地方传入T型的指针(任何类型都适用)。但是,这种允许在被限定的指针类型上轻微不匹配的规则(明显的例外)却不能递归调用,只能用于最上层。(因为const char ** 是const char的指针的指针,所以这个例外规则并不适用。)
不能向const char * * 指针赋char * 值的原因有些晦涩。const限定词既然存在,就是为了让编译器帮助你保证不修改const值。这就是为什么可以将char 赋向const char *,但反过来却不行。显然,使普通指针“常数化”是安全的,但反之就危险了。
若还是一头雾水,
请查看该参考博文:http://blog.chinaunix.net/uid-23629988-id-3064438.html
扩展思考:
1. const char *p; 或者char cosnt *p; // *p 不能修改 char *const p; // p 不能被修改 cosnt char *const p; // p 和 *p 不能被修改2. cosnt char **p; 或者char const **p; const char **const p; cosnt char *const*const p; const char *const*const*const p;
11.12 我这样声明:
typedef char *charp; const charp p;
为什么是p而不是它所指向的字符为const ?
**答:**typedef的替换并不完全是基于文本的。在声明 const charp p;中,p被声明为const的原因跟const int i 将 i 声明为const的原因一样。p的声明不会“深入”typedef的内容来发现涉及了指针。
11.26 为什么我不能对void *指针进行算术运算
答:编译器不知道所指对象的大小。(请记住,指针的算术运算总是基于所指对象的大小的。)因此不允许对void 指针进行算术运算(尽管有些编译器作为扩展允许这种运算)。在做运算之前,可以把指针转化为char 型或你准备操作的其他指针类型。
- 提取《你必须知道的495个C语言问题》一书中的个人要点
- 你必须知道的495个C语言问题 读书笔记
- 摘自【你必须知道的495个c语言问题】
- 《你必须知道的495个C语言问题》
- 《你必须知道的495个C语言问题》 笔记
- 你必须知道的495个C语言问题 读书笔记
- 你必须知道的495个C语言问题
- 你必须知道的495个C语言问题整理一
- <你必须知道的495个C语言问题>学习笔记 (一)
- C语言中你必须知道的100个问题
- 《你必须知道的495个C语言问题》笔记--C预处理器
- 《你必须知道的495个C语言问题》笔记--C预处理器
- 你必须知道的C语言问题
- 《你必须知道的495个C语言问题》笔记--自己的
- 2010.12.10-《你必须知道的495个C语言问题》
- 学习笔记_你必须知道的495个C语言问题
- 你必须知道的495个C语言问题-----学习笔记
- 你必须知道的495个C语言问题整理二
- 几个常考字符串函数处理
- 运行 iOS 模拟器中的 App 后显示空白-warning:Unsupported Configuration: Scene is unreachable due…
- 设计模式五大原则
- js和el表达式操作list
- opencv鼠标操作及GUI矩形绘画
- 提取《你必须知道的495个C语言问题》一书中的个人要点
- jQuery实现冻结 固定 表格行和列 (未测试)
- C++ ABI之名字改编(以Qt为例)
- JAVA的Swing图形界面与内部类
- C语言输出PI和正弦函数和余弦函数
- 1011. A+B和C (15)-PAT乙级真题
- hibernate3 的常用操作(批量删除,批量插入,关联查询) (未测试)
- Android 开发之Handler+Thread开发
- 个人笔记(cin.getline与cin.get)