重读《c primer plus》发现了99%的人都会忽略的知识点之声明和初始化
目录
这本《c primer plus》是很多人学习C语言的圣经,博主今天重读本书,发现了不得了的地方。
1.你需要知道基本概念什么是声明?
声明指定了一个变量的标识符,用来描述变量的类型,用于编译器识别变量名所引用的实体。
声明只是给变量、函数、结构体、联合体命名,表明程序有该变量、函数、结构体、联合体。
举个常见的例子变量声明
-
int a;
-
-
extern int a;
其中int a是定义变量和变量声明,extern int a仅仅是对变量的声明。
2.你可能忽略的知识点
2.1 关于整数类型的选择
名称 | 全称类型说明符 | 缩写类型说明符 | 位数 | 范围 |
整型 | int | int | 16位 | -32768至+32767 |
无符号整型 | unsigned int | unsigned | 16位 | 0 至 65,535 |
短整型 | short int | short | 16位 | -32768至+32767 |
无符号短整型 | unsigned short int | unsigned short | 16位 | 0 至 65,535 |
长整型 | long int | long | 32位 | -2,147,483,648 至 2,147,483,647 |
无符号长整型 | unsigned long int | unsigned long | 32位 | 0至4,294,967,295 |
需要定义比较大的数据,可以选择int 型,short 型,long型:
- 你需要定义很大的数据(大于 32, 767 或小于 −32, 767)这个时候就选择long型
- 对程序空间有要求,比如数字和很多结构体,此时用short型
- 剩下的其他类型可以用int 型
在编译器中,long 和 int 都是 32 位的,当需要定义一个32位的变量时,用 long,不要用 int。
当你的编译器不支持C99时,不能使用 long long 和 unsigned long long。
2.2 定义、声明全局变量和函数的小技巧
你需要知道:定义只能有一处,声明却可以有很多处。
为了提高程序的移植性,需要考虑到ANSI 下的编译器和连接器。
全局声明不要放在.c文件中,需要放在头文件下。编译器对声明的一致性检测,只检测头文件。
2.3 extern用法
2.3.1 extern在函数中的作用
函数的声明中带有关键字extern,仅仅是声明可能在别的源文件里定义,没有其它作用。
例如下面的两个函数
-
extern int fun1();
-
int fun1();
这个两个函数本质是一样的。
2.3.2 extern在变量中声明的作用
一个.c中引用其他.h声明的extern 变量,需要在此.c中对这个变量用extern声明,例如
-
//test1.h
-
extern int a;
在test2.c中引用变量a,一定要加extern
-
//test2.c
-
#include "test1.h."
-
-
extern int a;//只要看到此声明,就知道变量a是全局变量,且在其他源文件中是定义过
变量的声明有两种情况: 一种是变量存放在堆栈中,不用加extern;2、不需要使用存储空间,则要加extern 。
2.4 复杂声明的解读
复杂声明我们可以按照下面的优先级规则:
1.声明中被括号括起来的部分
2.后缀操作符:
括号()表示这是一个函数,而方括号[]表示这是一个数组。
3.前缀操作符:
*表示“指向...的指针”
例如下面这个函数声明:
char *(*(*a[N])())();
解读:
定义一个包含 N 个指向返 回指向字符的指针的函数的指针的数组
换一种方式用type来分解一下
-
typedef char *pc; /* 字符指针 */
-
-
typedef pc fpc(); /* 返回字符指针的函数 */
-
-
typedef fpc *pfpc; /* 上面函数的指针 */
-
-
typedef pfpc fpfpc(); /* 返回函数指针的函数 */
-
-
typedef fpfpc *pfpfpc; /* 上面函数的指针 */
-
-
pfpfpc a[N]; /* 上面指针的数组 */
2.5 函数指针的声明
举个隐式声明函数指针的例子,并完成初始化。
-
extern int func();
-
int (*fp)() = func;
文章来源: xintiaobao.blog.csdn.net,作者:心跳包,版权归原作者所有,如需转载,请联系作者。
原文链接:xintiaobao.blog.csdn.net/article/details/118500895
- 点赞
- 收藏
- 关注作者
评论(0)