提取《你必须知道的495个C语言问题》一书中的个人要点

前言

阅读《你必须知道的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 3

file1.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 型或你准备操作的其他指针类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值