[编程开发] C语言从零开始学习 | 有这一篇文章就够了

[复制链接]
gcz 发表于 2023-10-13 02:40:32|来自:北京 | 显示全部楼层 |阅读模式
今天我对C语言的部分入门基础知识做了些整理,知识整体脉络连贯,非常适合零基础小伙伴入门学习,想学好C语言的小伙伴认真阅读学习。
这篇文章的目的是给学习C语言的小伙伴做一个清晰的划分,希望每位同学能够通过这次的分享更好地进行学习。学习道路上有志同道合的小伙伴一起学习效果会更好,有人一起交流一起分享,能及时发现自己的不足从而补全知识,所以这里就推荐大家加入下方的学习交流群一起长大进步。
1、概述

毫无疑问,大部分资深程序员的编程生涯都是从C语言开始的。依稀还记得大一时候自学C语言时的情景,当时刚上大一,就在完全不懂得C语言是什么的情况下报名参加下学期的计算机二级(C语言)考试。
下面进入正题
1)教材选择
不想给大家一长串书名,那样也许就直接抹杀了你学习C语言的兴趣,这里重点推荐三本。

  • 《C程序设计》谭浩强


11

  • 《C程序设计语言》


这本书是C语言之父Dennis参与编写的,虽然不厚,但有些思想讲得比较到位。建议初学者学习。

  • 《C Primer Plus》


这本书是非常经典的教材,每个知识点都介绍的非常到位。可以说这是入门级的选手的终结教材。如果想学好C语言并在后面有更大的发展,这本书必须要看。它能帮你打下坚固的程序设计基础。
学习好这本书之后,学校里的各种考试和小竞赛就不在话下了。接下来,你该开始自己的进阶之路了。


2)IDE选择
如今,Turb C肯定是已经永远地退出历史舞台了,但初学者还是要选择一款合适的IDE才能方便的上手。

  • GCC + vim
很多学校的实验室都用的Linux系统,建议大家从vim开始编写最初的代码。
编写好后执行下面代码:
$ gcc -c main.c
$ gcc -o main main.o
$ ./main

  • Code::Blocks
这是一个轻量级的IDE,对于初学者而言,这是不二选择。安装和使用不需要花太多时间,让初学者把主要精力都放在写代码本身上。

  • VS 2019


无疑这是C语言开发最牛X的工具,然而这里不建议初学者使用。由于Microsoft自己制定了很多自己关于开发的规则,初学者会发现课本上的代码原封不动的敲在上面却报出莫名其妙的错误。
不过,当你拥有一定C语言基础的时候,VS的学习一定是必不可少的。
3)实践
编程是一门非常注重实践的学科,如果你不去亲自敲代码的话,那你永远也学不会。
这里分享一份适合初学者编程练习的实战项目练习资料。已经入门的朋友可以前去练习,有什么问题我们一起讨论。还有视频教程包含在内,帮助基础较差的同学也能掌握其中的项目原理,大大提升学习效率!


4)C语言知识结构


在我们学习的过程中,心里要有这么个树形结构才行。
有兴趣的同学可以参考用Visual Studio创建自己的第一个C语言项目这篇文章。后面我们会更多的使用VS2013给大家展示程序的调试过程。
2、基本语法

C语言的基本语法主要分五个部分:

  • 基本字符集
  • 数据类型
  • 常量与变量
  • 运算符和表达式
  • 数据类型转换


接下来我将分别讲解C语言的基本语法,这也将是学习C语言过程中最枯燥的部分。希望大家有心理准备。我会尽量用最轻松的方式讲解。过了这部分,后面的学习就会变得有意思一些了。
3、基本字符集

1)标识符的命名规则
(1) 什么是标识符?
在C语言中,符号常量,变量,数组,函数等都需要一定的名称,我们把这种名称成为标识符。也就是说,标识符我们为C语言中出现的所有元素取得名字。
(2)标识符的命名规则

  • 只能由字母,数字,下划线,或者美元符号($)组成
  • 不能以数字开头 ;
  • 区分大小写,通常变量名和函数名都用小写字母表示;
  • 不能和C语言中的32个关键字重名。
这些规则在编译时IDE都会帮你检查,如果违反了它会报错。所以不用专门去记。
2)关键字(保留字)
C语言中具有特殊含义的英文单词。通常用于构成语句,存储数据,定义数据类型等
C语言的共有32个关键字


这些关键字都是必须掌握的,不过不用死记硬背。等学完了相关的知识你在练习中自然就记住了。
3)分隔符
(1)空格
C语言中,大部分空格没有实际意义,只是方便我们阅读,具体规则后面会讲到。
(2)一般分隔符

  • 分号 (;) - 语句结尾
  • 大括号 ({  }) - 函数体,复合语句,以及数组的初始化等
  • 圆括号 (()) - 函数定义时,将参数括起来,或者改变运算的优先顺序(和数学中的括号类似)
  • 方括号 ([]) - 定义数组类型和应用元素
  • 点号 (.) - 结构体仲引用成员
  • 逗号(,) - 参数分隔
(3)注释符
注释是程序设计中不可缺少的部分。但它仅仅能被我们编程者看到,对于计算机而言,它是透明的。
//   单行注释,用于注释这个符号后面的内容
/* */    多行注释,用于注释掉"\*"和"*/"之间的全部内容4)例程
今天的内容就是这些,其实没有太难的东西,下面我们看一下上篇博文中Code::Blocks默认出现的那段代码,我做了简单的修改:


仔细看看这段代码,找找都用到了哪些上面提到过的东西。这里的代码几乎每次练习都要敲的,慢慢就都记住了。不懂的地方不用太纠结,这里只是先做了解。
4、基本数据类型&赋值

1)概述
C 语言包含的数据类型如下图所示:


这张图大家肯定在很多教材中都见过,它包含了C语言中涉及的全部数据类型
(1)数据类型的意义
先简单说一下数据类型的作用。在C语言中,程序操作的最基本的元素叫做变量。编程的实质就是把变量中保存的内容进行处理,最终返回一个处理后的结果。
而计算机用于保存不同变量的内部结构是不同的,最直接的不同就是在内存中为这个变量申请的空间大小不同。因此,我们在定义变量的时候应该告诉计算机这是一个什么类型的变量,这就是数据类型的意义。
一定有人会问,计算机为啥不给每个变量都分配一个足够大的空间,这样大家就可以使用同一种数据类型了,不用再做区分。这是因为最早的计算机内存是非常有限的,如果你只需要保存很小的数据却用了非常大的空间,那就造成了极大的浪费。如今内存越来越便宜,空间越来越大了,但节省空间开销依然是软件开发的一个重要原则。
话说有些脚本语言比如JavaScript中是淡化数据类型的,所有的变量都使用统一的数据类型var。有兴趣的同学可以了解一下。
(2)赋值
定义了变量之后,要给变量赋值。没有被赋值的变量是不能被使用的,这是C语言的一个重要规定。请看这段代码:
int a;
a = 5; 以上这两行完成了两个动作,第一行定义了一个数据类型为“int”,变量名为“a”的变量,第二行给变量"a"赋值5。
需要注意的是"int"和“a”中间需要一个空格,每行结束后需要一个“;”。
另外,第二行中“=”两边各有一个空格,这一点不是C语言要求的,只不过是业内约定俗成的规矩,方便阅读。这种规矩还有很多,后面会专门说到,让你的代码风格更地道。
如果觉得两行代码太麻烦,还可以这样写:
int a = 5; 这一行和前面的两行效果完全一样,采用哪种写法都可以。
此时如果我们想看看a中的值是不是5可以执行下面这行代码:
printf("%d", a); 现在你知道如何把这几行代码在Code::Blocks中运行吗?如果不会请阅读之前的文章。
BTW:最后要说的是,定义了变量一定要尽快赋一个值,我们叫初值。因为定义变量实际上是在内存中开辟了一块新空间,但空间里也许有之前留下的东西(数据)。所以,如果你不用初值把这块空间覆盖掉,很容易在后面出现莫名其妙的问题。
2)各种数据类型介绍
(1)整型
整型分为short、int、long,最大的特点就是在不同平台或编译器下所分配的内存空间不同。我们统一按32bit Windows操作系统进行讲解。
整型主要任务是保存自然数的,只不过保存数字的范围不同。
① 短整型(short)
一般大小2Bytes(16bits),定义方法:
short a = 1; ② 整型(int)
这是最常用的整型,一般大小4Bytes(32bits),定义方法:
int a = 6; ③ 长整型(long)
一般大小8Bytes(64bits),定义方法:
long a = 10; 虽然在不同平台这三种变量表示的大小不同,但有一个基本原则:
short类型的大小 <= int类型的大小 <= long类型的大小
“<=” 这个符号是C语言中“小于或等于”的意思,后面会介绍
(2)浮点型
浮点型包括单精度型和双精度型。
① 单精度型(float)
浮点型,又称实型,也称单精度。一般占4Bytes(32bits)
float a = 4.5f; 这里4.5后面有个“f”,先记着写法,后面我们会具体讲解。
② 双精度型(double)
一般占8Bytes(64bits)
double a = 4.5; 打印浮点型数值的方法略有不同,如下:
printf(&#34;%f&#34;, a); 注意,只是“%f”略有不同。
(3)字符类型
① 单个字符类型
在各种不同系统中,字符类型都占1Bytes(8bits)。定义如下:
char c = 'a'; 也可以用字符对应的ASCII码赋值,如下:
char c = 97; 打印字符类型的方法:
printf(&#34;%c&#34;, c); 这个类型需要多说几句。计算机其实是不能保存字符的,因此,字符类型的内部其实保存的也是数字。那么怎么知道哪个数字代表什么字符呢?有一张世界通用的“密码表”叫做ASCII码,它保存着大部分常用字符和数字的对应关系。
② 字符串
C语言中使用双引号&#34;  &#34;表示一个字符串,比如:&#34;ABCDEF&#34;。这就是我们在打印&#34;Hello World!&#34;时为什么要使用双引号的原因。
在C++中,有个字符串的类型交string,于是我们可以这么写:
string str = &#34;ABCDEF&#34;; 很遗憾的是,C语言中并没有string类型,我们只能用字符数组保存字符串。关于字符数组我们会在数组部分讲解。
③ 练习
这里提出个简单的问题,下面代码输出结果是什么,看你能不能想明白。
void main()
{
    char a = 'a';
    char c;
     
    c = a + 1;
    printf(&#34;%c&#34;, c);
} (4)其他类型
前面讲的六种数据类型是C语言的基础数据类型。目前掌握就可以了,至于其他的结构体、数组之类的后面会专门讲到。
还有两个关键字signed和unsigned,是用来定义变量是否保存正负号的,也可以先不了解。
3)变量的命名规则
真正的软件开发中,变量命名是一个非常重要的内容。在团队开发、项目传承的过程中,代码的可读性起着重要的作用。因此要养成好的变量命名习惯。
(1)命名要能望文生义
要便于记忆和阅读。标识符最好采用英文单词或其组合,不允许使用拼音。程序中的英文单词一般不要太复杂,用词应当准确。C语言开发中有一个比较著名的命名规则叫“匈牙利命名法”,有兴趣可以学习一下。
无论什么样的命名规则,都有它的利弊所在,真正的项目中也会有具体的命名规则要求。重点是,每个人自己写的代码要自己有一个统一的规则,这样无论是别人还是自己都更容易读懂和维护。不要过一段时间连自己写的代码都看不懂了,这是最基本的要求。
其实大学计算机等级考试中,很多题目都是符合这条的,这给考生很多空子可钻。记得有个题目是这样的。
int a, b, sum;
a = 5;
b = 1;

sum = XXXXX(a, b);

printf(&#34;%d&#34;, sum); 请问屏幕打印出的数字是多少?
这道题主要考的是XXXX函数的问题,也许你根本没看懂这个函数是啥意思,但一看变量“sum”你就知道最终输出的肯定是一个和,所以答案是6。
(2)要用最短的命名表达最多的意思
虽然现在对命名长度的限制越来越小,但过长的命名还是影响代码的可读性。
(3)尽量不要出现数字
Value1,Value2 这样的变量还是少用为好。
(4)不要靠大小写区分的相似的标识符
int a, A; // 绝对不允许  反正容易混淆的就尽量别用。
好了,基本数据类型&赋值就先说到这里,接下来我们开始讲常量与变量。
5、常量&变量

1)常量
记得博主当年学C语言的时候总是搞不懂什么是常量。统统当做是变量,当时并不影响写小程序,后来工作了做嵌入式开发时才暴露出基础不牢的问题。希望大家在学习时一定把概念搞清楚。
(1)整型常量
① 十进制整数
这个不难理解,就是我们常说的自然数。如:
int a = 123;
int b = +145;
int c = -32; 上面的代码中,“=”右面的就是十进制整数。可以带正负号,一搬“+”号省略。
② 八进制整数
八进制的数表示为前面带“0”的数,如:
int a = 0124;
int b = +054;
int c = -014; 上面的代码中,“=”右边都是八进制整数。看到这种貌似多余的“0”就要反应出是八进制。
③ 十六进制整数
与八进制不同,十六进制整数以“0x”开头,如:
int a = 0x17c;
int b = +0x123;
int c = -0xfcc; 上面的代码中,“=”右边的是十六进制整数。
(2)实型常量
① 十进制小数形式
与数学中的小数形式相同,如:
double a = 0.0;
double b = 0.29;
double c = 21.45;

float d = 0.1f; 上面代码中“=”右面的就是十进制小数。值得注意的是,float类型赋值时,常量的后面要加&#34;f&#34;,因为不加这个&#34;f&#34; 计算机会分配一个double类型大小的空间,而前面的变量类型又是float,这时就会报错。
② 十进制指数形式
指数形式表示如下:
double a = 2.4E4; // 2.4 * 10 ^ 4
double b = 3.1e3; // 3.1 * 10 ^ 3 这是科学计数法的表示形式,第一行表示2.4乘以10的4次方。使用“E”或“e”都可以。
(3)字符常量
① 普通字符
字符常量需要用单引号表示,或者用ASCII码值。还记得上一篇中《潜伏》里的故事吗?
char a = 'A';
char b = 65; 上面代码中“=”右面的是字符常量。为什么?第二行明明是数字啊。因为ASCII码中65表示大写字母A,如果赋值给int类型的变量,它就是65,如果赋值给char型变量,它就是字母A。
② 转义字符
C语言中用反斜杠“\”加字符表示一直特殊的意义,叫做转义字符。下面是转义字符表。


还记得HelloWorld程序吗?里面有这样一句话:
printf(&#34;Hello World!\n&#34;); 这句话中的\n就是个转义字符,表示在输出这行字之后,再输出一个换行符号。
(4)字符串常量
记得上一篇中说过,字符串的表示是用双引号&#34;  &#34;
char str[] = &#34;ABCD&#34;; 这句话的意义是定义一个字符数组,这个大家可以先不了解。“=”右面就表示一个字符串常量。
需要说明的是,字符串的存储比较特殊,系统会自动在字符串后面加入一个'\0'符号。这个符号在转义字符表中可以找到,代表空字符。计算机用它表示一个字符串的结束。因此,&#34;ABCD&#34;在内存中其实是&#34;ABCD\0&#34;。
那么,问题来了。请问&#34;a&#34;和'a'有什么区别呢?
(5)符号常量
又叫做宏常量,是一个预处理命令,格式如下:
#DeFine 常量名 常量 我们看下面的代码:
#define PI 3.1415926

double a = PI * 2; 上面的代码中由于有了第一句,第二句就相当于:
double a = 3.1415926 * 2; 值得注意的是,这种宏常量的表示方法相当于把定义中常量位置的东西原封不动地写在常量名的地方。经常有这样的题目:
#include <stdio.h>

#define sum 5 + 1;

void main()
{
    int a = 2 * sum;
    printf(&#34;%d&#34;, a);
} 请问,这段程序输出的结果是多少。如果你答12就错了,应该是11。不信你用计算机运行一下试试。
原因就是2 * sum这句在编译器看来应该是
int a = 2 * 5 + 1; 如果你的本意是想得到12,那么定义中应该这么写:
#define sum (5 + 1); 2)变量
(1)什么是变量?
上面我们讲到,我们的程序在运行过程中把数据保存在内存中,每个数据保存的位置都有一个地址。如果我们每次操作数据都要写一次地址(如:0x5e34a031)那么可读性太差。因此,在C语言中我们用一个个的变量操作对应内存中数据的操作。
(2)变量的使用
一个简单的 int a = 1;其实暗地里执行了以下操作

  • 定义变量
    int a,在内存中开辟了4Bytes的内存空间,并且为这个空间起了个名字,叫做a
  • 赋值
    = 1,这是变量的初始化,在a对应的内存空间中放入一个数1
再次强调,C语言中,变量在使用前一定要初始化。否则会出现意想不到的错误。原因上一篇中讲过。
例程讲解:
今天我们看一个简单的小例子。
#include <stdio.h>

void main()
{
    int a, b, sum;

    int c = 3;

    a = 1;     
    b = 2;  
   
    sum = a + b + c;

    printf(&#34;sum = %d\n&#34;, sum);
} 程序运行结果 :


程序分析:
#include <stdio.h> 我们编程需要用到很多现有的工具集合,我们叫做库。库里面都有什么呢,有各种各样的工具,叫做函数。比如我们向屏幕打印数据的printf就是函数。这个后面会细讲。这句话就是告诉计算机,我们会用到stdio.h这个库,让它提前准备好。只有引用了这个库,计算机才知道到哪里找printf这个函数。
stdio.h叫做头文件。目前掌握这些就好了。后面会具体讲解。
void main() 这是一个函数的形式,后面会讲到。这个函数的内容写在两个大括号之间。目前只要知道main函数是所有程序的入口,我们写好的程序都是从这个函数开始执行的。换句话说,没有这个函数的程序无法执行。
main函数有两种形式,第一种就是我们今天用到的:
void main()
{
    // 函数内容
} 另一种是:
int main()
{
    // 函数内容
    return 0;
} 这种形式带有一个返回值,两种形式功能基本相同。先这样理解。
int a, b, sum;
int c = 3;  
a = 1;  
b = 2; 这一段对四个变量进行了定义,对三个赋了初值。
sum = a + b + c; 这一行把a,b,c三个变量的值求和存入sum变量中。
printf(&#34;sum = %d\n&#34;, sum); 这句话打印出sum的值。这次的printf使用的很特殊,前面加了&#34;sum =&#34; 这个字符串,打印出来的效果参考结果图片。在打印结果中,%d被sum真正的值所代替,后面会仔细讲解。
篇幅有限,还有运算符与类型转换、其他运算符的详细内容这里就不过多介绍了,下面是我整理的一套系统化学习资料分享给大家,内容清晰详细,包含有详细的学习路线、视频教程等学习内容,帮助大家迅速掌握这些基础知识!




上面讲解的这些都是组成C语言最基本的语法点,有了这些基础,我们就能通过它们设计出任何一个我们想要的“虚拟世界”。对于这部分的学习重点在于理解,具体的关键字和使用方法可以在练习中通过查资料的方式慢慢记忆。
学习编程过程里任何脱离了上机练习的死记硬背都是不可取的。
6、交互

计算机程序最大的作用就是通过与用户交互来完成各种功能。对于我们用来做练习的控制台程序而言,在屏幕上打印信息和用户通过键盘输入就是最主要的交互途径。
另外,对于一些倡导不使用IDE开发的程序员而言,打印Debug信息是代码调试的重要方法之一。
7、流程控制

大部分人在学习这部分内容之前都觉得编程并没有什么神奇的,因为让计算机一条一条的按顺序执行我们的命令并不一定比我们自己计算的效率高。看起来的确是这样。
不过,计算机程序的真正魅力其实在于通过简单流程控制的叠加完成无比复杂的计算。比如绘制下面这个图形。后面的三篇内容就介绍了这部分功能。


在学习了这部分之后,你已经可以自己设计一个相对成熟的软件产品了。
8、数组



计算机的另一个强大的功能就是大量数据的处理,它通常能够很好地处理一组相同类型数据的集合。这个集合就叫数组。
我们一般意义上的一句话实际是一组字符的集合,我们叫做字符数组。
9、指针



10、最后

如果大家对C语言感兴趣的话,可以加入下方的学习交流群,免费领取一套学习资料和视频课程,群里面都是志同道合的学习者,学习过程中相互交流讨论对学习效率是很有帮助的,还有很多技术大佬在群里分享学习经验和方法,帮助大家指导学习,少走弯路,学习氛围相当不错!
学习计算机语言是枯燥的,同时也是充满乐趣的。即使有一天你会彻底丢弃它,但这个学习的过程会给你留下一份特殊的能力,那就是逻辑思维能力。
最近越来越多的人认为在未来世界里编程会像开车和讲英语一样成为每个人必备的基本技能。如果真是这样,现在就学会了的你就比身边的其他人更容易跨过新时代的门槛。
全部回复1 显示全部楼层
yuyuyouling 发表于 2023-10-13 02:41:15|来自:北京 | 显示全部楼层
老师,资料哪里可以下载呢?

快速回帖

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则