提取《你必须知道的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 型或你准备操作的其他指针类型。

0 0
原创粉丝点击