发 帖  
原厂入驻New
发烧友10周年庆典,全网超值优惠来袭!千元现金券,下单抽奖赶紧参与》》

[经验] 朱兆祺教你如何攻破C语言学习、笔试与机试的难点(连载)

2013-7-31 08:47:54  183741 C语言 C语言 C语言 C语言 C语言
分享
341
本帖最后由 zzq宁静致远 于 2014-2-27 19:42 编辑

    再过1个月又是一年应届毕业生应聘的高峰期了,为了方便应届毕业生应聘,笔者将大学四年C语言知识及去年本人C语言笔试难点进行梳理,希望能对今年应届毕业生的应聘有所帮助。

2013年10月18日更新-->    攻破C语言这个帖子更新到这里,我不仅仅是为了补充大学学生遗漏的知识,我更重要的是希望通过我的经验,你们实际项目中的C语言写得漂亮,写出属于你的风格。“朱兆祺STM32手记”(http://bbs.elecfans.com/jishu_385613_1_1.html)一帖中我就多次强调过编程的模块化,要考虑到可移植性和别人的可阅读性。我在某公司实习的时候,拿到一个程序,我当时就想吐槽,我想除了这个程序的当时写作者能够看懂之外,其他人有谁还能看懂,程序构架、可移植性性就更是一塌糊涂。结果我全部推到重写。因此明志电子科技工作室从承接第一个项目做开始,我便和搭档说,我们必须制定我们工作室的编程规范和编程风格,这样就算给谁,换成谁,拿到项目都能马上接下去做。
    朱兆祺在这个帖子将会不断更新,明志电子工作室的项目经验也将在电子发烧友论坛不断贴出,我希望能用我们仅有的力量,将我们的经验毫不保留传授给大家。我只希望在未来某一天,有那么几个人会竖着大拇指说:明志电子科技工作室的经验受益匪浅就够了。我相信,在深圳,明志电子科技工作室的影响力会日益增长,因为我们已经规划好了未来脚步。
    C语言是一门技术,但更是一门艺术。写一个C语言代码不难,写一个高水平、漂亮的代码很难。朱兆祺将在此帖不断为大家攻破C语言。

<--朱兆祺于2013年10月18日

-->朱兆祺更新于2014年2月21日:
    深圳市馒头科技有限公司于2014年2月注册成立,当初命名为馒头科技,不管是吴坚鸿所说亲切还是谢贤斌所说草根。馒头科技永远以用户满意为我们的追求,馒头科技不追求锦上添花,但是我们很愿意为每一位客户雪中送炭。因为锦上添花每一个人都会做,但是雪中送炭却不是每一个人愿意去做。
    馒头科技往后将为每一位读者送上更为精美的学习资料。敬请期待。



第一节  C语言编程中的几个基本概念
http://bbs.elecfans.com/jishu_354666_1_1.html

第二节  数据存储与变量
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2088253&fromuid=222350

第三节  数学算法解决C语言问题
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2088283&fromuid=222350

第四节  关键字、运算符与语句
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2088352&fromuid=222350

第五节    C语言中的细节
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2088375&fromuid=222350

第六节  数组与指针
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2088417&fromuid=222350

第七节  结构体与联合体
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2088582&fromuid=222350

第八节  内存分配与内存释放
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2088596&fromuid=222350

第九节   笔试中的几个常考题
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2088606&fromuid=222350

第十节  数据结构之冒泡排序、选择排序
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2092632&fromuid=222350

第十一节   机试题之数据编码
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2096393&fromuid=222350

第十二节  机试题之十进制1~N的所有整数中出现“1”的个数
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2097513&fromuid=222350

第十三节  机试题之  遍历单链表一次,找出链表中间元素
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2103563&fromuid=222350

第十四节  机试题之全排序
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2105648&fromuid=222350


第十五节 机试题之大整数运算
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2109737&fromuid=222350


第十六节  机试题之大整数减法与乘法
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2115675&fromuid=222350

第十七节  算法之二分查找
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2128027&fromuid=222350

第十八节  数据结构之单向链表(颠覆你手中数据结构的三观)
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2139670&fromuid=222350

第十九节  数据结构之双向链表(接着颠覆你手中的数据结构三观)
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2156978&fromuid=222350

第二十节 数据结构之栈
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2193337&fromuid=222350


C语言技术公开课第一讲——编译环境给C语言带来的困扰,网络课程讲义
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2230571&fromuid=222350

第二十一节  通过加减法高效的求出两个无符号整数的商和余数
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2252461&fromuid=222350

第二十二节  表达式计算器(1)
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2280837&fromuid=222350

第二十三节  表达式计算器(2)
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2325485&fromuid=222350

第二十四节  表达式计算器(3)
http://bbs.elecfans.com/forum.ph ... 4547&fromuid=222350

第二十五节  表达式计算器(4)
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2395966&fromuid=222350

C语言技术公开课第三讲  const问题
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2434706&fromuid=222350

第二十六节  序列差最小
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2466868&fromuid=222350

第二十七节  sizeof与strlen的深入
http://bbs.elecfans.com/forum.php?mod=redirect&goto=findpost&ptid=354666&pid=2676569&fromuid=222350

第二十八节  C与C++中的const

第二十九节 do、while
第三十节 变量的生命周期

第一节  C语言编程中的几个基本概念
1.1      include< >与#include" "


1.   #include< >和#include" "有什么区别?
这个题目考查大家的基础能力,#include< >用来包含开发环境提供的库,
#include" "用来包含.c/.cpp文件所在目录下的头文件。注意:有些开发环境可以在当前目录下面自动收索(包含子目录),有些开发环境需要指定明确的文件路径名。
1.2      switch()
1.   switch(c) 语句中 c 可以是 int, long, char, float, unsigned int 类型?
其实这个题目很基础,c应该是整型或者可以隐式转换为整型的数据,很明显不能是实型(float、double)。所以这个命题是错误的。
1.3      const
1.   const有什么用途?
虽然const很常用,但是我相信有很多人仍然答不上来。
(1) 欲阻止一个变量被改变,可以使用const 关键字。在定义该 const 变量时,通常需要对它进行初 始化,因为以后就没有机会再去改变它了;
(2) 对指针来说,可以指定指针本身为 const,也可以指定指针所指的数据为 const,或二者同时指定为 const;
(3) 在一个函数声明中,const 可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;
(4) 对于类的成员函数,若指定其为 const 类型,则表明其是一个常函数,不能修改类的成员变量;
(5) 对于类的成员函数,有时候必须指定其返回值为 const 类型,以使得其返回值不为“左值”。
1.4      #IFndef/#define/#endif
1.   头文件中的 #ifndef/#define/#endif 干什么用?
其实#ifndef、#define、#endif这些在u-boot、linux内核文件中经常见到,在这么大型的程序中大量使用,可见它的作用不可小觑。
这些条件预编译多用于对代码的编译控制,增加代码的可裁剪性,通过宏定义可以轻松的对代码进行裁剪。
#ifndef/#define/#endif最主要的作用是防止头文件被重复定义。
1.5      全局变量和局部变量
times New Roman">1.         全局变量和局部变量在内存中是否有区别?如果有,是什么区别?
全局变量储存在静态数据库,局部变量在堆栈。 其实,由于计算机没有通用数据寄存器,则函数的参数、局部变量和返回值只能保存在堆栈中。提示:局部变量太大可能导致栈溢出,所以建议把较大数组放在main函数外,防止产生栈溢出。
思考:如程序清单1. 1所示。会出现怎样的情况?
程序清单1. 1  大数组放在main函数中导致堆栈溢出
int main(int argc, char *argv[])
{
    int iArray[1024 * 1024];
    return 0;
}






评分

参与人数 3威望 +7 +7 积分 +10 收起 理由
eminjie + 2 + 2
A670521546 + 5 + 5 很精彩,期待您更多的分享
冰葑世纪 + 5 + 5 您的付出是论坛的动力,感谢您一直支持!.

查看全部评分

jiangjiachisi 2014-1-16 10:31:31
{:1:}{:1:}{:1:}{:1:}{:1:}{:1:}{:1:}{:1:}
回复

举报

chen65015 2014-1-20 15:26:54
收藏啦~~~~~~~~~~~~
回复

举报

chen65015 2014-1-20 15:27:18
收藏啦~~~~~~~~~~~~
回复

举报

wantong0219 2014-1-20 17:12:58
拜读中...........
回复

举报

玄风夕韵 2014-1-22 12:39:12
顶啊!好资料,,,,。。。。。。。。
回复

举报

stellar 2014-2-12 17:41:00
{:1:}{:1:}
回复

举报

zzq宁静致远 2014-2-21 20:59:05
第二十七节  sizeof与strlen的深入
学校安排电气工程与自动化学院学生去校医院进行体检,远远就能听见测量身高那位医生一直在喊:“杨杰,170cm”,“范毅,160cm”……每个学生往测量身高的仪器一站,每个人身高都将会测量出来。
在C语言的数据类型中也一样,只要往sizeof中一放,每个数据类型占据了几个字节的内存也都一目了然。
1.   如程序清单7. 1所示,sizeof(a),sizeof(b)分别是多少?
程序清单7. 1  sizeof
#include <stdio.h>
int main(int argc, char *argv[])
{
    char  a[2][3] ;
    short b[2][3] ;
    printf( "sizeof(a) = %d \n" , sizeof( a ) ) ;
    printf( "sizeof(b) = %d \n" , sizeof( b ) ) ;
    return 0;
}
由于char 是1个字节、short是2个字节,所以本题答案是:
sizeof(a) = 6
sizeof(b) = 12
请按任意键继续. . .
为什么char是1个字节、short是2个字节呢?
并非说char占2个字节、short占2个字节、int占4个字节这些天生就是这样的,这与编译器有关。也就是说这些数据类型所占的字节数是会随着编译器的不一样而改变。由于本书使用的都是32位的编译器,那么其数据类型所占字节数的关系如下:
char 1个字节
short int 2个字节
int 4个字节
unsigned int 4个字节
float 4个字节
double 8个字节
好的,再来看看如程序清单7. 2所示,sizeof(a),sizeof(b)分别是多少?
程序清单7. 2  sizeof
#include <stdio.h>
int main(int argc, char *argv[])
{
    char  *a[2][3] ;
    short *b[2][3] ;
    printf( "sizeof(a) = %d \n" , sizeof( a ) ) ;
    printf( "sizeof(b) = %d \n" , sizeof( b ) ) ;
    return 0;
}
是数组指针呢,还是指针数组呢?这里涉及*和[]和优先级的问题。我告诉大家的是这两个数组存放的都是指针变量,至于为什么,在后续章节会详细解释,然而指针变量所占的字节数为4字节,所以答案:
sizeof(a) = 24
sizeof(b) = 24
请按任意键继续. . .
为什么指针变量所占字节数为4个字节呢?
我相信在看这本书的读者应该都知道指针,指针记录的是一个对象的地址。既然指针是来存放地址的,那么它当然等于计算机内部地址总线的宽度。所以在32位计算机中,一个指针变量的返回值必定是4个字节。这就是为什么指针变量所占字节数为4的原因。
留给读者一个思考题:
    int    *ip;
    char   *cp;
    double *dp;
    void   *vp;
    printf("sizeof(ip) = %d \n", sizeof(ip));
    printf("sizeof(cp) = %d \n", sizeof(cp));
    printf("sizeof(dp) = %d \n", sizeof(dp));
    printf("sizeof(vp) = %d \n", sizeof(vp));
在这里读者要特别注意的是sizeof使用的时候后面会加括号,但是一个测量数据类型长度的关键字,而并非是一个函数,因此字节数的计算在程序编译时进行,而不是在程序执行的过程中计算出来。sizeof具有类似功能的一个函数:strlen()strlen()所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值。
sizeof和strlen的区别:
1.         sizeof是运算符关键字;strlen是函数。
2.         sizeof在程序编译时进行字节数的计算;strlen的结果在程序执行的过程中进行计算。
3.         sizeof用于计算类型所占内存的大小;strlen用于计算字符串的长度。
4.         sizeof可以用类型和函数做参数;strlen只能用char*做参数,且必须是以“\0”结尾。
5.         数组做sizeof的参数时不退化;传递给strlen时会退化为指针。

回复

举报

一剑式 2014-2-22 14:25:45
赞~好文章,支持,感谢
回复

举报

dpjfsy007 2014-2-22 14:28:58
谢谢分享,楼主辛苦了
回复

举报

lichenglei99 2014-2-22 16:24:30
有时间一定好好的看看。
回复

举报

_hhy 2014-2-22 19:57:55
深刻学习了!!!!!!!!
回复

举报

_hhy 2014-2-22 19:59:40
希望楼主发一份到我邮箱了,十分感谢!
1016814199@qq.com
回复

举报

zzq宁静致远 2014-2-23 10:11:49
第二十八节  C与C++中的const
其实在C++中一般不会使用#define定义常量,而是使用const定义常量。这是因为:
1)         const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换中可能会产生意料不到的错误(边际效应)。
2)         有部分调试工具可以对const常量进行调试,但是不能对宏常量进行调试。在C++程序中只使用const常量而不使用宏常量,即const常量完全取代宏常量。
实际上常量的引进是在早期的C++版本中,当时标准C规范正在制订。那时,常量被看做一个好的思想而被包含。在C中。但是,C中的const的意思是“一个不能被改变的普通变量”。在C中,它总是占用内存,而且它的名字是全局符。C编译器不能把const看成一个编译期间的常量。在C中,如果写:
const  iSize = 100;
char   cArray[iSize];
尽管看起来好像做了一件合理的事,但这将得到一个错误的结果。因为iSize占用内存的某个地方,所以C编译器不知道它在编译时的值。在C语言中可以选择这样书写:
const   iSize;
这样写在C++中是不对的,而C编译器则把它作为一个声明,这个声明指明在别的地方有内存分配。因为C默认const是外部连接的,C++默认const是内部连接的,这样,如果在C++中想完成与C中同样的事情,必须用extern把内部连接改成外部连接:
extern const iSize;
这种方法也可用在C语言中。在C语言中使用限定符const不是很有用,即使是在常数表达式里(必须在编译期间被求出)想使用一个已命名的值,使用const也不是很有用的。C迫使程序员在预处理器里使用#define。

回复

举报

小平平 2014-2-23 11:03:36
很不错,顶
回复

举报

守候幸福_1 2014-2-23 12:46:52
学习了 详细的资料
回复

举报

ncscwf 2014-2-23 18:47:46
谢谢分享,学习了
回复

举报

xp918127 2014-2-23 22:25:29
膜拜朱大神,感谢你的亲临论坛,久仰大名,听吴大神说过,祝你们的事业兴旺发达,膜拜中
回复

举报

xp918127 2014-2-23 22:26:21
谢谢大神的无私奉献,没你的天赋啊!点醒我好多东东
回复

举报

du4182565 2014-2-24 09:38:01
{:12:}{:12:}{:12:}{:12:}{:12:}{:12:}{:12:}{:12:}{:12:}
回复

举报

zzq宁静致远 2014-2-24 13:08:33
xp918127 发表于 2014-2-23 22:25
膜拜朱大神,感谢你的亲临论坛,久仰大名,听吴大神说过,祝你们的事业兴旺发达,膜拜中 ...

谢谢,深圳市馒头科技有限公司出品,必属精品。今年深圳市馒头科技有限公司将加大马力,更精彩将呈现给大家。
回复

举报

评论

高级模式
您需要登录后才可以回帖 登录 | 注册

发经验
课程
    关闭

    站长推荐 上一条 /10 下一条

    快速回复 返回顶部 返回列表