重读《c primer plus》发现了99%的人都会忽略的知识点之声明和初始化

举报
心跳包 发表于 2021/11/13 00:18:49 2021/11/13
【摘要】    目录  1.你需要知道基本概念什么是声明? 2.你可能忽略的知识点 2.1 关于整数类型的选择 2.2 定义、声明全局变量和函数的小技巧 2.3 extern用法 2.3.1 extern在函数中的作用 2.3.2 extern在变量中声明的作用 2.4 复杂声明的解读 ...

  

目录

 1.你需要知道基本概念什么是声明?

2.你可能忽略的知识点

2.1 关于整数类型的选择

2.2 定义、声明全局变量和函数的小技巧

2.3 extern用法

2.3.1 extern在函数中的作用

2.3.2 extern在变量中声明的作用

2.4 复杂声明的解读

 2.5 函数指针的声明


这本《c primer plus》是很多人学习C语言的圣经,博主今天重读本书,发现了不得了的地方。

 1.你需要知道基本概念什么是声明?

声明指定了一个变量的标识符,用来描述变量的类型,用于编译器识别变量名所引用的实体。

声明只是给变量、函数、结构体、联合体命名,表明程序有该变量、函数、结构体、联合体。

 举个常见的例子变量声明


  
  1. int a;
  2. 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,仅仅是声明可能在别的源文件里定义,没有其它作用。

例如下面的两个函数


  
  1. extern int fun1();
  2. int fun1();

这个两个函数本质是一样的。

2.3.2 extern在变量中声明的作用

一个.c中引用其他.h声明的extern 变量,需要在此.c中对这个变量用extern声明,例如


  
  1. //test1.h
  2. extern int a;

在test2.c中引用变量a,一定要加extern


  
  1. //test2.c
  2. #include "test1.h."
  3. extern int a;//只要看到此声明,就知道变量a是全局变量,且在其他源文件中是定义过

变量的声明有两种情况: 一种是变量存放在堆栈中,不用加extern;2、不需要使用存储空间,则要加extern 。

2.4 复杂声明的解读

复杂声明我们可以按照下面的优先级规则:

1.声明中被括号括起来的部分

2.后缀操作符:

   括号()表示这是一个函数,而方括号[]表示这是一个数组。

3.前缀操作符:

   *表示“指向...的指针”

例如下面这个函数声明:

char *(*(*a[N])())();

 解读:

定义一个包含 N 个指向返 回指向字符的指针的函数的指针的数组

 换一种方式用type来分解一下


  
  1. typedef char *pc; /* 字符指针 */
  2. typedef pc fpc(); /* 返回字符指针的函数 */
  3. typedef fpc *pfpc; /* 上面函数的指针 */
  4. typedef pfpc fpfpc(); /* 返回函数指针的函数 */
  5. typedef fpfpc *pfpfpc; /* 上面函数的指针 */
  6. pfpfpc a[N]; /* 上面指针的数组 */

 2.5 函数指针的声明

返回值类型 ( * 指针变量名) ([形参列表]);

举个隐式声明函数指针的例子,并完成初始化。


  
  1. extern int func();
  2. int (*fp)() = func;

文章来源: xintiaobao.blog.csdn.net,作者:心跳包,版权归原作者所有,如需转载,请联系作者。

原文链接:xintiaobao.blog.csdn.net/article/details/118500895

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。