你必须知道的495个C语言问题,学习体会一
C语言作为一门古老的语言,其灵活性和容易出错都让人 又爱又恨,书籍《你必须知道的495个C语言问题》,使用问答的形式,告诉读者 C语言使用的各个方面的知识,包括一些冷知识等。以下,我要摘录和整理些 ,我认为比较重要的知识进行分享。
知识 一:声明,定义与初始化
1.关于int与long,众所周知,C语言标准没有规定标准类型的大小,特别是对于int类型,在甚多16位的机器上看,int类型其实是16位的,而到了32位机器上,int就是32位的了,实际上,int类型代表了机器的自然字长,这是多整形变量的当然之选,在标准头文件中已经定义了标准类型名称int16_t和int32_t,分别表示这两种字长。而long则一直是 32位的,long long 则是64位。但是,到了64位机器时代,long型已经变成了64位了,而int本身还是保持着32位的字长。
2.区别声明 和 定义 ,declaration or definetion
书中 给的 解释 如下:首先,尽管一个全局变量或函数可以(在多个编译单元中)多次“声明”,但是“定义”却最多只能出现一次,对于全局变量,定义是真正分配空间并赋初值(如果有)的声明,对于函数,定义是提供函数体的“声明”。
当希望在多个源文件中共享变量或者函数时 ,需要确保定义和声明的一致性,最好的安排是在某个相关的.c文件中定义,然后在.h中进行外部声明。在需要使用的时候,只要包含对应的头文件即可。
将全局变量定义在.h中是一个好主意
3.存储类型
- auto:
已过时的关键字 ,目前在C++11中又重获新生,当然,这是后话了。 static:神奇一 、书面解释是静态、不发展、改变的意思,这个关键词我用了很长时间才搞清楚到底是什么意思,很多的笔试答案就很高端了,死记硬背的答案,其实是很可悲的。其,我们可以从存储位置 和使用位置进行说明 :
- 在.c文件内部修饰全局变量或者函数,说明其修饰的变量或者函数只在本文件中有效,外部文件无法调用,这样可以防止与其他编译单元重名发生冲突,其存储位置都在 静态存储区
- 在函数体中,则说明该变量不受函数 入栈和出栈的影响,可以保持其值不变,如果函数中对其进行了操作,则这种影响会一直存在,因此对其值得修改只能在该函数体内部。
- 在C++中 出现在类的 成员变量 和 成员函数前。
const
神奇二、记住 不是常量 的意思,可以理解为 只读,可以参看volatile与const综合分析
4.复杂声明
这是C让人痛不欲生的源泉。
比如 声明 char *(*(*a[N])())();
这到底是什么鬼?
下面 请遵守 "从内到外"的 理解方式来 理解下:
记住:[] 和() 比* 优先级高
- 第一层: a[N] 一个元素为N个的数组
- 第二层:*a[N] 元素类型为一个指针
- 第三层:(*a[N])() 该指针为一个函数指针
- 第四层:(*(*a[N])())() 该函数返回 一个函数的指针
- 第五层:char *(*(*a[N])())() 该指针的类型 是一个函数,该函数的返回值是char*
那么再看我们常用的 函数指针 类型,就很简单了;比如:
char *( *pf )(double* dd,int n);
- 第一层: *pf 一个指针
- 第二层: (*pf)(double* dd,int n) 函数参数为double*dd, int n的函数指针
- 第三层: 这个函数的返回值 是char *
可见,一个声明的 最终类型 由第一层的 类型指定的。现在 你要是还分不清楚 函数指针 和指针函数就说不过去了。
那么,我们会解析一个复杂声明了,我们怎么自己声明呢?
这里 ,我推荐使用 typedef
还是最上面的例子,我们怎么样使用typedef 来做声明呢?
typedefchar* pc;//声明一个指向char* 的指针
typedef pc fpc();//声明一个返回值为char* 的函数
typedef fpc *pfpc;//声明一个返回值为该函数 的 指针
typedef pfpc fpfpc();// 声明一个 返回值为 以上指针的函数
typedef fpfpc *pfpfpc;// 声明一个 以上类型的函数指针
pfpfpc a[N];//声明一个数组,该数组的类型为以上函数指针
在实际编码中 ,自然不可能有如此多层的声明,一般的,我们都是声明的两层,还是函数指针的例子,我们可以这样声明:
typedefchar*(*pf)(double*dd,int n);
pf repf;
5.初始化
实际的编码中,忘记初始化,或者初始化错误造成的问题还是很严重的。
建议,所有的区域的变量都进行人工显式的初始化,别偷懒哈。
你必须知道的495个C语言问题,学习体会一的更多相关文章
- C语言学习书籍推荐《你必须知道的495个C语言问题》
萨米特 (Steve summit) (作者), 孙云 (译者), 朱群英 (译者) 下载地址:点我 <你必须知道的495个C语言问题>以问答的形式组织内容,讨论了学习或使用C语言的过程中 ...
- 《你必须知道的495个C语言问题》知识笔记及补充
1. extern在函数声明中是什么意思? 它能够用作一种格式上的提示表明函数的定义可能在还有一个源文件里.但在 extern int f(); 和 int f(); 之间并没有实质的差别. 补充:e ...
- 你必须知道的495个C语言问题,学习体会四
本文,我们来学习下指针,这是个梦魇啊.无数次折磨着C语言学习者,无数次的内存泄露,无数次的访问失败,无数次的越界溢出, 这些错误造就的仅仅是一个 跟随者,真正的优秀者必须要正视语言的局限,同时在最大限 ...
- 你必须知道的495个C语言问题,学习体会三
本文是 本系列的第三篇,本文主要对C语言的表达式做个小结 先从两个坑爹的表达式说起:i++ 与++i 上大学的时候,学长告诉我,这两个表达式,意义是一样的,后来老师纠正说,还是有区别的,于是让我们记住 ...
- 你必须知道的495个C语言问题,学习体会二
这是本主题的第二篇文章,主要就结构体,枚举.联合体做一些解释 1.结构体 现代C语言编程 结构化的基石,diy时代的最好代言人,是面向对象编程中类的老祖宗. 我们很容易定义一个结构体,比如学生: st ...
- 你必须知道的495个c语言问题(笔记)
1.1我该如何决定使用哪种整数类型? 用到较大的数用long:空间很重要(例如有很大的数组或很多的结构)用short:此外用int. win32: int 32bit 4byte char 8b ...
- 《你必须知道的495个C语言问题》读书笔记之第11-14章:ANSI C标准、库函数、浮点数
一.ANSI C标准 1. ANSI向C语言预处理器引入了几项新的功能,包括“字符串化”操作符(#).“符号粘贴”操作符(##).#pragma指令. 2. Q:char a[3] = "a ...
- 《你必须知道的495个C语言问题》读书笔记之第8-10章:字符串、布尔类型和预处理器
一.字符和字符串 1. Q:为什么strcat(string, '!')不行? A:strcat()用于拼接字符串,所以应该写成strcat(string, "!")." ...
- 《你必须知道的495个C语言问题》读书笔记之第4-7章:指针
1. Q:为什么我不能对void *指针进行算术运算? A:因为编译器不知道所值对象的大小,而指针的算法运算总是基于所指对象的大小的. 2. Q:C语言可以“按引用传参”吗? A:不可以.严格来说,C ...
随机推荐
- JVM内存杂记1
大多数 JVM 将内存区域划分为 Method Area(Non-Heap)(方法区) ,Heap(堆) , Program Counter Register(程序计数器) , VM Stack( ...
- Codeforces Round #397 by Kaspersky Lab and Barcelona Bootcamp (Div. 1 + Div. 2 combined) A - Neverending competitions
地址:http://codeforces.com/contest/765/problem/A 题目: A. Neverending competitions time limit per test 2 ...
- Node单线程与异步编程的初步理解
最近学习了一些关于node的单线程与异步的知识,想拿过来和大家分享下: var async = require('async') //并行无关联,等待事件为最长时间请求过程.如以下两个任务执行时间 c ...
- JS与Jquery 中的extend用法不同
1, Jquery //jQuery 应用扩展 jQuery.extend({ // 定义setApDiv setApDiv:function () { ...
- 手机调取摄像头问题(getUserMedia)
先说坏消息,苹果机没法玩这个!!! 而且,必须拥有 https 的安全协议!!! 而安卓机想完成这个功能倒是很 easy 的,看一眼代码 主要传入三个参数,配置对象,成功,失败 var mediaOp ...
- springboot与redis的无缝整合(分布式)
参考博客 : https://blog.csdn.net/csao204282/article/details/54092997 1 首先得引入依赖 <dependency> <gr ...
- 20145201 《Java程序设计》第五周学习总结
20145201 <Java程序设计>第五周学习总结 教材学习内容总结 本周学习了课本第八.九章内容,即异常处理.Collection与Map. 第八章 异常处理 8.1 语法与集成架构 ...
- python标准库学习-SimpleHTTPServer
这是一个专题 记录学习python标准库的笔记及心得 简单http服务 SimpleHTTPServer 使用 python -m SimpleHTTPServer 默认启动8000端口 源码: &q ...
- 图论_FatherChristmasFlymouse(Tarjan+dijkstra or spfa)
堆优化Dij VS Spfa 堆优化Dij小胜一筹. 题目名字:Father Christmas flymouse (POJ 3160) 这题可以说是图论做的比较畅快的一题,比较综合,很想说一说. 首 ...
- POJ 3977 - subset - 折半枚举
2017-08-01 21:45:19 writer:pprp 题目: • POJ 3977• 给定n个数,求一个子集(非空)• 使得子集内元素和的绝对值最小• n ≤ 35 AC代码如下:(难点:枚 ...