新手上路 C语言教程.docx
- 文档编号:9751474
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:48
- 大小:66.93KB
新手上路 C语言教程.docx
《新手上路 C语言教程.docx》由会员分享,可在线阅读,更多相关《新手上路 C语言教程.docx(48页珍藏版)》请在冰豆网上搜索。
新手上路C语言教程
本文由xwaga贡献
doc文档可能在WAP端浏览体验不佳。
建议您优先选择TXT,或下载源文件到本机查看。
本文包括:
本文包括:
1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.1.引言2.什么是C语言?
3.最简单的C程序4.C程序编译过程解析5.变量:
程序保存结果的手段6.Printf7.Printf:
读取用户输入8.Scanf9.if语句和while循环10.示例:
编写能够打印华氏-摄氏温度转换表的程序11.数组12.更多变量知识13.函数14.函数原型15.函数库16.创建一个函数库17.makefile18.文本文件19.打开文本文件20.读取文本文件21.指针22.为什么要用指针?
23.指针基础24.内存地址25.指向同一地址26.指针常见错误27.指针作为函数参数28.动态数据结构29.计算机中的栈和堆30.malloc函数和free函数31.指针进阶32.指向结构体的指针33.指向指针的指针34.链表栈35.用指针操作数组36.字符串37.字符串须知38.运算符优先级39.命令行参数40.二进制文件41.了解更多信息软件类文章42.阅读所有软件软件
C语言是一种广受欢迎且用途广泛的程序设计语言。
人们使用它编写计算机程序计算机程序。
因为C计算机程序功能强、效率高,所以全世界的程序员都喜欢用它。
如果您是一名程序员,或者希望成为一名程序员的话,那么学习C语言会使您受益匪浅:
您将可以在许多平台上阅读和编写程序。
小到微控制器,大到最先进的科研系统,到处都是C语言的用武之地。
许多现代操作系统也是用C语言编写的。
学习过C语言后,再进阶的面向对象C++语言就容易多了。
C++是对C的扩展。
不先掌握C语言而直接学习C++是非常困难的。
本文中,我们将会循序渐进地完整介绍C语言,并教会您怎样从零起步成为一名C程序员。
一旦您掌握了C语言,您一定会对自己可以做的事情感到吃惊的!
C语言入门教程
C是一种计算机编程语言就是说可以用C编写指令清单交给计算机去执行。
是当前正在计算机编程语言。
C计算机编程语言使用的成千上万种编程语言之一。
它已经有几十年的历史了。
因为它功能强大而且效率很高,所以受到了程序员们广泛的欢迎。
C还是一种容易学习的语言。
和其他一些语言相比,C的风格稍有点古怪,但您会很快适应的。
HSW
C语言编译器
C是所谓的编译型语言编译型语言,意思是说您写好的源程序必须通过C编译器来运行,使它变成可编译器编译型语言以在计算机上运行(执行)的可执行文件可执行文件。
C源程序是供人阅读的,而编译器产生的可执行可执行文件程序是供计算机读入和执行的。
也就是说,要编写并运行一个C程序,您必须借助于C编译器。
如果使用UNIX系统(例如,您在UNIX主机上用C编写CGI脚本,或者您是学生,在实验室的UNIX机器上工作),C编译器是免费提供的。
它的名字是cc或者gcc,可以通过命令行调用。
您如果是学生,那么学校很可能会向您提供编译器。
您只要查一下学校提供什么样的编译器并学习使用即可。
如果您是在家使用Windows操作系统的计算机,则需要下载免费的C编译器或是购买商业的C编译器。
微软公司的VisualC++是一套广泛使用的商业编译环境,可以编译C和C++程序。
可惜这套软件要花费几百美元。
如果不想花那么多钱购买商业编译器的话,那么您可以在网上挑选一款免费的编译器。
如果您想找的话,不妨从我们会从一个极其简单的C语言程序为例开始,循序渐进。
在这个例子中,我假定您使用的是UNIX命令行,并以gcc作为您的开发环境。
如果您使用的并不是这些,所有的代码依然可以正常运行——您只是需要使用其他可用的编译器,才能理解这些代码。
让我们从一个最简单的C程序开始,了解一下C的基本要素和编译过程。
将下面的程序录入一个标准的文本编辑器(UNIX上用vi或emacs、Windows上用Notepad、Macintosh上用TeachText),然后以samp.c的文件名保存。
文件名如果没有.c结尾,编译的时候就很可能会出现一些错误,所以要确保文件名以.c结尾。
另外,请确保您的编辑器不会自动在文件名末尾添加后缀(如.txt)。
下面是我们的第一个程序:
#includeintmain(){printf("这是我第一个程序的输出!
\n");return0;}执行时,程序使计算机输出“这是我第一个程序的输出!
”,之后便退出了。
真是简单到不能再简单了!
书写位置
录入本程序时,注意将#include中的“#”放在第一列,即最左侧。
其他行的间距和缩进可随个人喜好选择。
某些UNIX系统上有一个叫cb的C程序美化器,它可以为您美化代码格式。
上例程序代码的空格和缩进风格可作为格式的范例。
请按下面步骤编译本程序:
在UNIX系统上,键入gccsamp.c-osamp(若gcc不能用就用cc)。
此命令行的作用是调用名为gcc的C编译器来编译samp.c,并将生成的可执行文件命名为samp。
要运行编译好的程序,请键入samp(有些UNIX系统上要键入./samp)。
在使用在使用DJGPP的DOS和Windows电脑上,请在MS-DOS命令中键入gccsamp.c-osamp.exe。
这条命令会调用名叫gcc的C编译器,使它编译samp.c,并生成一个可执行文件samp.exe。
要运行程序,只需键入samp。
如果您使用的是其他编译器或其他开发系统,阅读并遵循该编译器的指南。
当您运行这个程序后,您应该会看到“这是我第一个程序的输出!
”的打印了。
当您编译这个程序时,到底发生了什么?
下面是示意图:
HSW
C语言编译器
如果您键入程序时打错了,它要么不会编译,要么不会运行。
如果程序没有编译,或者没有正确地运行,请重新编辑,检查输入的时候是否有误。
然后修正错误,重新编译。
让我们逐行讲解一下这个示例程序,看看每一行都做了什么(点击这里在新窗口中打开程序):
程序以#include开始。
这一行将“标准输入输出库(StandardI/Olibrary)”包括进程序之中。
使用标准输入输出库您可以完成诸如从键盘(称为“标准输入”)读入数据、向屏幕(称为“标准输出”)写出数据、处理磁盘上的文本文件之类的工作。
这是一个极有用的函数库。
C拥有大量像stdio一样的函数库,包括字符串、时间和数学函
?
?
数库等。
函数库就是一个别人写好供我们调用的代码包,它使我们编程变得更加容易(我们在后面讨论函数库)。
intmain()这行声明了主函数。
所有的C程序都必须包含一个名为main的函数。
我们稍后将学习更多关于函数的知识。
程序从主函数的第一行开始运行。
C语言使用花括号({和})标识一个代码块的开始和结束。
本例中构成主函数的代码块包括两行。
printf语句将输出的内容送往标准输出设备(对我们而言就是屏幕)。
引号中的部分叫做格式字符串,用于表示数据输出时的格式。
格式字符串可以包含文字(“这是我第一个程序的输出!
”)、回车换行符(n)和标识变量位置的操作符等。
如果您使用的是UNIX系统,可以键入man3printf获得printf函数的完整说明文档。
其他系统下您可以通过阅读编译器相关的文档来了解printf函数的细节。
return0;这行使主函数向运行它的命令行解释器返回错误代码0(表示没有错误)。
稍后我们还会继续介绍这一特性。
作为程序员,您的程序常常需要“记住”某个数值。
比如您的程序要求用户输入一个数,或者它计算出了一个结果,您需要把它保存在某处供以后使用。
程序是靠使用变量变量来保存结果的。
变量例如:
intb;上面这行的意思是说:
“我想创建一个可以容纳一个整数的存储空间,名字叫做b。
”每个变量都有名字(本例中是b)和类型(本例中是int,表示整型)。
您可以用如下语句在b中存储一个值:
b=5;您可以用如下语句使用b中保存的值:
printf("%d",b);C语言提供了几种标准的变量类型:
?
?
int-整型,用于保存整数值float-用于保存浮点值char-用于保存单个字符值,如“m”或“Z”
后面我们会看到整型以外其他类型的例子。
printf语句语句将要输出的内容送往标准输出设备。
对我们而言,标准输出设备一般就是计算机屏幕(虽然您也可以将标准输出重定向到一个文本文件或另一个命令)。
下面这个程序将有助于您深入理解printf:
#includeintmain()
{inta,b,c;a=5;b=7;c=a+b;printf("%d+%d=%d\n",a,b,c);return0;}
请录入程序并保存,文件名是add.c。
在命令行键入gccadd.c-oadd进行编译,之后再键入add(或./add)运行程序。
您会看到输出:
“5+7=12”。
下面是该程序各行的解释:
?
?
?
inta,b,c;这行声明了三个分别名为a、b和c的整型变量。
整型变量用于保存整数。
下一行将变量a的值初始化为5。
再下一行将变量b的值初始化为7。
再下一行将a和b相加,并将结果“赋值”给c。
计算机将a中的值(5)和b中的值(7)相加得到结果12,并把新值(12)存入变量c。
变量c被赋值12。
因此,本行中的“=”称为“赋值运算符”。
接下来printf语句会打印“5+7=12”。
占位符%d的作用是为输出值占位。
本行有三个%d占位符,末尾有三个变量名:
a、b和c。
C语言将第一个%d和a匹配并替换为5;将第二个%d和b匹配并替换为7;将第三个%d和c匹配并替换为12。
然后在屏幕上打印替换结果:
“5+7=12”。
+、=及空格作为格式字符串的一部分,按程序员指定的顺序自动插入到%d运算符之间。
前面的程序很好,但要是如果能从用户那里读入值5和7而不是使用固定的值的话,那就更好了。
可以改为下面的程序:
#includeintmain(){inta,b,c;printf("输入第一个值:
");scanf("%d",printf("输入第二个值:
");scanf("%d",c=a+b;printf("%d+%d=%d\n",a,b,c);return0;
}
以下是程序的执行过程:
HSW
C语言执行程序示例
请按照上例修改原来的程序,然后重新编译和执行并确保它能正常工作。
注意scanf和printf都要使用格式字符串(可以键入manscanf获取更多信息)还要注意a和b前面都有一个“&”。
。
这是C语言中的取地址运算符,它会返回变数的地址(在我们讨论指针之前,这个符号没什么用)。
在对单个字符,整数,或者浮点数形式的任何变量做标准输入,以及对结构形式(我们很快就会接触到)的任何变量做标准输入时,您都必须使用&运算符。
如果您遗漏了&运算符,您在运行程序时会报错。
您可以试试,这样就能看到这种运行错误是什么样子。
让我们通过一些变量来完全理解printf。
这是最简单的printf声明:
printf("您好");它的格式字符串告诉printf把“您好”二字发送到标准输出。
对比:
printf("您好\n");两者的区别是后者在“您好”后跟一个回车换行,一起送到标准输出。
下面这行显示了如何使用printf输出一个变量的值。
printf("%d",b)%d是占位符,会在printf语句执行时替换为变量b的值。
通常您需要把输出值嵌入到一些文字之中。
一种方法是这样:
printf("温度是");printf("%d",b);printf("度\n");更简单的方法是这样写:
printf("温度是%d度\n",b);一个printf语句中可以使用多个%d占位符:
printf("%d+%d=%d\n",a,b,c);在printf语句中,格式字符串包含的操作符操作符数目和后面的变量的数目和类型一定要一致,这操作符一点极为重要。
例如,如果格式字符串包含有三个%d操作符,那么格式字符串后面必须紧接正好三个参数,且参数的类型和先后顺序必须和操作符指定的是一样的。
使用不同形式的占位符,printf可以打印所有的C标准类型:
?
?
?
int(整数)用%dfloat(浮点数)用%fchar(单个字符)用%c字符串(字符数组,见后面讨论)用%s
在UNIX机器上要了解printf的更多细节,可以键入man3printf。
如果使用任何其他C编译器,则您很可能在其附带手册或帮助文件中找到对printf的说明。
使用scanf函数函数可以从标准输入设备接受输入。
对我们而言,标准输入设备一般就是键盘。
虽然scanf函数可以做许多事情,但是除了最简单的工作外,一般而言并不很可靠。
原因是它不能很好地处理人为错误。
不过,对于简单的程序来说,scanf还是很合适的,而且易于使用。
scanf的最简单用法是像这样:
scanf("%d",&b);
该程序将读取用户从键盘输入的一个整数(和在printf中一样,%d代表整型,因此b必须声明为int),并将其存入b。
scanf函数使用的占位符和printf的相同:
?
?
?
int用%dfloat用%fchar用%c字符串(后面会讨论)用%s
在使用scanf时,您必须在其变量前加上&。
为什么要这么做的原因,在您学习指针后会很清楚。
&符号很容易忽略,而一旦您忘记添加&,几乎每次运行程序都会崩溃。
通常来说,最好像在这里举的例子一样使用scanf函数——读取键盘输入的单个数值。
读取多个数值的时候,请多次调用scanf函数。
不过,在任何一个实际的(而不是用来演示的)程序中,您将不会使用scan函数,而是使用gets或者fgets函数来一次一整行地阅读文本。
然后您会分析这一行,并读取它的值。
这么做的原因是,您可以检测到输入的错误,并做恰当的处理。
要完全理解printf和scanf函数,需要一些练习。
一旦掌握了,它们非常有用。
试试这个!
修改这个程序,使它能接受3个数值,而不是2个,并把3个数值相加。
#includeintmain(){inta,b,c;printf("输入第一个值:
");scanf("%d",&a);printf("输入第二个值:
");scanf("%d",&b);c=a+b;printf("%d+%d=%d\n",a,b,c);return0;}?
试着在上述程序中随意删除或添加字符或者词语,看编译器对这些错误如何反应。
比如说,在上述程序的第一行删除b变量,看看当您忘记了声明变量时,编译器会怎么办。
删除一个分号,看会发生什么。
或者漏掉一半大括号。
删掉主函数旁边的一个圆括号。
尝试每一种错误,然后通过编译器运行程序,看会发生什么。
通过模拟这些错误,您会了解不同种类的编译器错误,并在当您真正地犯了这些错误的时候,更容易找到这些输入错误。
C常见错误
?
用错大小写。
C语言区分大小写,因此Printf和PRINTF都不对,必须是printf。
在scanf中忘了使用&。
?
在printf或scanf的格式声明中参数太多,或者太少。
在使用变量的时候没有事先声明。
C语言中,if语句while循环语句和循环都会用到布尔表达式布尔表达式。
下面是一个使用if语句的简单例子:
布尔表达式#include
intmain(){intb;printf("输入一个值:
");scanf("%d",&b);if(b<0)printf("值为负数n");return0;}程序从用户读入一个数字,然后用if语句测试这个数字是否小于零。
如果小于零则打印一条消息,否则什么也不做。
程序中的(b<0)称为布尔表达式。
C需要求出此表达式的值才能决定是否打印后面的消息。
如果布尔表达式的结果是真,那么C将执行紧接在if语句后面的一行代码(或花括号中的代码块);如果布尔表达式的结果是假,那么C将跳过紧接在if语句后面的代码行或代码块。
下面是一个稍复杂一点的例子:
#includeintmain(){intb;printf("输入一个值:
");scanf("%d",&b);if(b<0)printf("值为负数n");elseif(b==0)printf("值为0n");elseprintf("值为正数n");return0;}
这个例子中的elseif和else部分处理了值为零或为正的情况。
下面是一个更复杂一些的布尔表达式:
if((x==y)&&(j>k))z=1;elseq=10;上面这个if语句的意思是:
“如果变量x和y的值相等,而且变量j的值大于k的值,那么令变量z的值等于1,否则令变量q的值等于10。
”在C程序中,您经常使用类似这样的if语句进行判断。
一般而言,大多数判断都很简单,像第一个例子。
但偶尔也会遇到复杂一些的情况。
请注意,C使用==判断相等,而用=为变量赋值。
&&在C中代表布尔操作符与。
这是C语言中的所有的布尔操作符:
等于==小于<大于>小于等于<=大于等于>=不等于!
=与&&或||非!
您会发现,while声明和if声明使用起来一样简单。
举个例子:
while(a
大体来说,while声明是这样工作的:
C还提供一种do-while结构:
do{printf("%dn",a);a=a+1;}while(a
例如,您有如下C代码:
x=1;while(x<10){
……
x++;}您可以用for循环改写成下面这样:
for(x=1;x<10;x++){……}请注意,while循环实际包括了三个步骤:
初始化(x=1)、判断(x<10)和增量(x++)。
使用for循环可以把三个步骤写在同一行中,但并不限制三个部分的具体内容。
例如,您有如下C代码:
a=1;b=6;
while(a
for(a=1,b=6;a
在for循环的初始化和增量(不包括测试)部分,我们可以使用多条语句并用逗号操作符加以分隔。
许多C程序员喜欢用一行代码“浓缩”进很多信息。
但也有许多人认为这样会使代码更加难以理解,所以他们选择分开来写。
布尔表达式中=和==的对比
==符号是C语言的一个常见的“陷阱”,因为时不时会由于疏忽将其写成=。
这个错误很容易犯,但对于编译器来说两者的含义截然不同。
C的布尔表达式既接受=也接受==,然而程序的执行却大相径庭。
C的布尔表达式求值的结果是整数,所以整数也可以直接作为布尔表达式使用。
C中整数零代表假,其他任何非零整数代表真。
下面是的C代码是合法的:
#includeintmain(){inta;printf("输入一个数字:
");scanf("%d",&a);if(a){printf("值为真n");}return0;}
如果a是任何非零值,printf语句就会执行。
在C中,诸如if(a=b)这样的语句的意义是:
“将b赋值给a,然后判断a的布尔值。
”如果a变成0,则if语句判断为假,否则为真。
也就是说a的值在判断过程中改变了。
如果您本该写==的,那么以上行为显然不是您的本意(尽管正确使用时还可利用这一特性)。
所
以在使用=和==的时候请格外小心。
假设您要编写一个能够打印华氏-摄氏温度转换表的程序。
可以使用for或者while循环可以轻松实现:
#includeintmain(){inta;a=0;while(a<=100){printf("%4d华氏度=%4d摄氏度\n",a,(a-32.0)*5.0/9.0);a=a+10;}return0;}该程序运行后将打印从华氏0度到华氏100度的转换表。
输出如下:
0华氏度=-17摄氏度10华氏度=-12摄氏度20华氏度=-6摄氏度30华氏度=-1摄氏度40华氏度=4摄氏度50华氏度=10摄氏度60华氏度=15摄氏度70华氏度=21摄氏度80华氏度=26摄氏度90华氏度=32摄氏度100华氏度=37摄氏度上表中温度值以10度为间隔递增。
您会发现通过程序改变表中温度的起始值、结束值和递增值都很容易。
如果想让温度值更加精确的话,您可以改用浮点数值浮点数值:
浮点数值#includeintmain(){floata;a=0;
while(a<=100){printf("%6.2f华氏度=%6.2f摄氏度\n",a,(a-32.0)*5.0/9.0);a=a+10;}return0;}如上例所示,a的声明改用float,而且在printf语句中用符号%f代替了符号%d。
此外,还在符号%f前规定了一些格式:
打印数值时使用6位整数和2位小数。
现在我们要修改程序,使它在适当的位置插入98.6度。
即,我们还是每隔10度打印,但是要增加一行98.6华氏度,因为它是人体的正常体温。
下面的程序会满足我们的要求:
#include
intmain(){floata;a=0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 新手上路 C语言教程 新手 上路 语言 教程