C语言学习的关键,是要先搞明白,学C语言到底是在学些什么?
我这么一问,有的同学就要翻开课本,指着目录说,我知道我知道,有变量,数据类型,循环语句,函数,哦哦哦,还有指针等等!
很遗憾,如果你以为学习C语言就是学习这些东西,那你得赶紧纠正一下看法,否则接下来的学习会困难重重。因为我曾经就是这么掉到坑里的,这种狭隘的观点让我浪费了大量的时间去学习琐碎的细节,又让我迟迟不能接触到更重要的知识,结果是眼高手低——知道许多别人不知道的无用知识,但是又写不出什么真正像样的程序来。
所谓“语法”,就是入门教材里最着重讲解的内容。也就是那些所谓的变量、数据类型、分支判断、循环、函数、指针等等。
这些内容比较枯燥,但是好消息是这些内容并不难,都是一些格式化的东西。只要你多练习,就会自动的刻在你的脑子里,成为一种下意识的习惯。
但是 “语法”本身其实没什么用。因为它只是一种格式规范,你学得再好,也不能引导你写出厉害的程序。因为在软件设计中,实际上最核心的部分还是在于其 “函数库”部分。
什么是 “函数库”?
简单来说,函数库就是别人编写好的C函数,直接提供给你用,你只要调用里面的函数,就能实现一定的功能。例如 printf() 函数,你肯定知道,只要调用这个函数,你就能够在那个黑糊糊的窗口里显示一段文字。你并不明白 printf() 的内部工作原理,但是你知道你只要按照说明去调用,就能够实现对应的功能。
这就是函数库——别人写好的,打包送到你面前,你可以自由调用来做各种各样的事情的函数集合。
我来说几个来自函数库的函数,例如 CreateWindowEx() 函数可以用来创建一个窗体(这个函数由微软提供),例如 GaussianBlur() 函数可以用来对一个图像进行高斯模糊处理(这个函数由 OpenCV 提供),再比如 evhttp_new() 函数可以创建一个 HTTP 服务程序(这个函数由 libevent 提供)……
其他还有什么库函数?太多了。从控制网络通信,到截取视频画面并分析其中的人脸位置,到加解密本地文件,甚至包括微信收发消息,抓取淘宝商品信息……库函数的数量和有用程度远远超乎大家的想象。
诶?你从来没听说过还有这些东西?课本里也没提到?
那是因为你看的是入门教材,着重讲解语法,顺带提到了少量的 C 语言自带的库函数而已。事实上 C 语言包含的库函数本身就有不少,但是更多更强大的还是许多第三方库函数,例如我上面提到的这些。
重点是在于,我想告诉你,库函数才是你学习C语言并将其应用于实际的关键!!
学会调用别人的库函数,甚至写出自己的库函数,都是极其重要的。因为一个函数,本质上就是一个功能单位。你拥有的基础设施越多,你的发挥空间越大。道理就是这么简单。这就是我需要向大家强调的第二个观点,要想写出实用的C程序,一大关键就是研究并学会使用各种库函数。
你看见隔壁王二写了个三维程序能让一个彩色的立方体在空中旋转?快找 OpenGL 库函数来用。什么?刘大宝写了个网络软件能在局域网里聊天?快找 Socket 库来用。
看见了吗?库函数有多重要?
但是,函数库的学习并不是孤立的。许多库函数背后需要一定的领域知识支撑。同样如我第一个观点所述,需要预备知识。学懂一个函数库,代表的不仅仅是明白如何调用那么简单, 而更反映了我们对一个特定领域——网络、数字图像、密码学、操作系统等的认识。
关键字:C语言 语法 函数库
引用地址:
学C语言到底学些什么— “语法”和“函数库”
推荐阅读最新更新时间:2024-03-16 13:56
c语言一百例第二十例
代码: /* C语言第二十例 题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高? 程序分析:见下面注释。 */ #include stdio.h void main(void) { float a,b; a=b=100; //落下第一次接触地面,100,记录下来,第二次小球弹起来,又要掉下去,等于100的一半乘以二,以此类推。 a=a/2; for(int c=2;c =10;c++)//第一次已经记录,只需后面的 { b=b+2*a; //总距离 a=a/2; //离地面的距离
[单片机]
DS1302数码管显示 时间日期可调C语言程序设计
#include at89x52.h #include DS1302.h //定义共阳极字型码0123456789- unsigned char code dispcode ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}; unsigned char time ={0,0,0,0,0,0,0,0};//用来储存时间 unsigned char date ={0,0,0,0,0,0,0,0};//用来储存日期 SYSTEMTIME time1; //在ds1302.h文件中已经定义了一个名字为SYSTEMTIME的结构体,在这里我们定义一个变量名
[单片机]
单片机C语言程序设计之T0控制LED实现二进制计数
AT89C51单片机是美国ATMEL公司生产的低电压、高性能CMOS 8位单片机,具有丰富的内部资源:4kB闪存、128BRAM、32根I/O口线、2个16位定时/计数器、5个向量两级中断结构、2个全双工的串行口,具有4.25~5.50V的电压工作范围和0~24MHz工作频率,使用AT89C51单片机时无须外扩存储器。 单片机C语言程序设计之T0控制LED实现二进制计数 T0控制LED实现二进制计数原理图 T0控制LED实现二进制计数程序设计 /* 名称:T0 控制 LED 实现二进制计数说明:本例对按键的计数没有使用查询法,没有使用外部中断函数,没有使用定时或计数中断函数。而是启用了计数器,连接在 T0 引脚的按键每次按
[单片机]
AVR c语言的位操作
位操作 一个共同的任务是编程微控制器 MCU打开或关闭IO 寄存器的一些位bit 很幸运标准C 有较好的和适用的位操作功能而没有借助于汇编指令或其它非标准C 结构C 定义了一些按位进行的运算是很有用的 a | b – 按位或 这个表达式指示中a 被表达式中的b 按位进行或运算这惯用于打开某些位尤其常用|=的形式 例如PORTA |= 0x80; // 打开位7 (最高位) a & b – 按位与 这个运算在检查某些位是否置1 时有用例如 If ((PORTA & 0x81) == 0) // 检查位7 和位0 注意圆括号需要括在&运算符的周围因为它和= = 相比运算优先级较低这是C 程序中很多错误的原因之一 a ^ b – 按位异
[单片机]
PIC C语言编程_PICC中变量修饰关键词
1) extern — 外部变量声明 如果在一个 C 程序文件中要使用一些变量但其原型定义写在另外的文件中,那么在本文件中必须将这些变量声明成“extern”外部类型。例如程序文件 code1.c 中有如下定义: bank1 unsigned char var1, var2; //定义了 bank1 中的两个变量 在另外一个程序文件 code2.c 中要对上面定义的变量进行操作,则必须在程序的开头定义: extern bank1 unsigned char var1, var2; //声明位于 bank1 的外部变量 2) volatile — 易变型变量声明 PICC 中还有一个变量修饰词在普通
[单片机]
1602LCD液晶数字电子钟 时钟表 C语言
1602LCD液晶数字电子钟 基本设计思路: 1. 1602LCD显示: 第一行: 年, 月, 日 2012-01-22 第二行: 时, 分, 秒 23:59:00 2. 独立按键功能: Key1 恢复单片机调时之前的实际时间, 由于在调整时间期间,定时器T0暂停, 则启动定时器T1, 保证单片机的时间正确.(即 取消调时) Key2 进入调整时间状态: 停止定时器T0,启动定时器T1. Key3 退出调整时间状态: 启动定时器T0,停止定时器T1. Key4 选择调整时间: 秒, 分, 时, 日, 月, 年 Key5 调时: 递增 同时启动蜂鸣器 Key6 调时: 递减 同时启动蜂鸣器
[单片机]
简介如何用用C语言进行单片机程序设计
一、 如何提高C语言编程代码的效率 邓宏杰指出,用C语言进行单片机程序设计是单片机开发与应用的必然趋势。他强调:“如果使用C编程时,要达到最高的效率,最好熟悉所使用的C编译器。先试验一下每条C语言编译以后对应的汇编语言的语句行数,这样就可以很明确的知道效率。在今后编程的时候,使用编译效率最高的语句。”他指出,各家的C编译器都会有一定的差异,故编译效率也会有所不同,优秀的嵌入式系统C编译器代码长度和执行时间仅比以汇编语言编写的同样功能程度长5-20%。他说:“对于复杂而开发时间紧的项目时,可以采用C语言,但前提是要求你对该MCU系统的C语言和C编译器非常熟悉,特别要注意该C编译系统所能支持的数据类型和算法。虽然C语言是最普遍的
[单片机]
STM32下模拟I2C的C语言实现
近来主要在写一些STM32上的开发程序,由于STM32的固件库中,I2C模块实在是不好用,所以在采用了软件模拟的方法来实现。 具体的代码如下(在Keil下调试通过): #include stm32f10x_lib.h //条件编译 1:使用软件模拟I2C //#define PIN_SCL GPIO_Pin_6 //#define PIN_SDA GPIO_Pin_7 static __inline void TWI_SCL_0(void) { GPIOB- BRR=PIN_SCL; } static __inline void TWI_SCL_1(void) { GPIOB- BSRR=P
[单片机]