基础知识
当前位置:首页 > 公文写作 > 基础知识 > 列表页

c语言基础知识教程

小草范文网  发布于:2017-02-10  分类: 基础知识 手机版

篇一:C语言基础知识实例讲解

C语言基础知识:实例讲解

这篇文章旨在让各位对 C 有个总体的认识,有看不懂的地方请不必太在意,只要记住就可以了,继续往下学下去就会明白的。

首先请看下面这个简单的 C 程序,猜猜它会做些什么。猜不出来也没关系,后面会有详细的解说。

#include <stdio.h>

int main( void )/* 一个简单的程序 */

{

intnum;/* 声明一个名叫num的变量 */

num = 1;/* 将 1 赋值给num*/

printf( "This is a simple C program. " ); /* 调用printf函数 */

printf( "My favorite number is %d because it is first. ", num );

return 0;

}

在对这个程序进行详细说明之前,我想先请您用编译器把它编译成可执行文件,并且运行,看看运行结果和您的猜想是否一致。如果不懂如何进行编译,请参考以下文章:

下面,我将分两步对这个程序进行详细的讲解。第一步是概要说明,也就是对程序中每一行代码的含义作简单讲解,以帮助您对这个程序有一个大致的理解。第二步是详细说明,也就是程序中的每一行代码进行详细的讲解,以加深您的理解。

一、概要说明

#include <stdio.h><-把另外一个文件包含进来

这行代码命令编译器把头文件(.h 文件)stdio.h中的内容包含到我们的

程序中。stdio.h是C语言的标准头文件之一,提供对键盘输入和显示输出等的

支持。要使用printf函数,就应该包含这个头文件。顺带一提,stdio代表

standard input/output,也就是标准输入输出的意思

int main(void) <-函数头

C 程序由一个或多个函数组成。我们的这个程序只有一个函数:main 函数。 圆括号 () 表明 main 是一个函数;int表明 main 函数返回一个整数;void 表明 main 函数不接受任何参数。在此,请您紧记,int main(void) 是 ISO/ANSI C

标准中定义的 main 函数定义方法之一。

/* a simple program */ <-注释

/* 和 */ 用于对程序进行注释说明,帮助读者更快更好地理解程序。编译器 会忽略 /* 和 */ 之间的内容(包括 /* 和 */),不会对它们进行编译。

{ <-函数体的开端

这个开大括弧 { 标志着函数体开始。函数体以闭大括弧 } 结束。在 { 和 }

之间的语句都属于这个函数。

intnum; <-声明变量num

这个语句表明我们声明了一个名叫num的变量。int表明这个变量为

整型变量。

num = 1; <-赋值语句

这个语句将 1 赋值给变量num。执行这个语句后,num的值等于 1 。

printf( "This is a simple C program. " ); <-函数调用语句

printf函数是 C 语言标准函数库里的函数。这个语句调用printf函数在

屏幕上显示“This is a simple C program.”,并且换行。是换行符,它提示

printf开始新的一行,也就是将光标移动到下一行的开端。如果上面的语句中没有 ,那就不会换行,而且光标会紧跟在“This is a simple program.”后面。

printf( "My favorite number is %d because it is first. ", num );

%d 告诉printf用num的值替换掉 %d ,并且以整数形式显示num的值。 因为num的值为 1 ,所以这个语句在屏幕上显示“My favorite number is 1

because it is first.”,并且换行。

return 0; <-返回语句

C 程序应该返回一个数值给它的调用者。0 代表程序无误退出;而其它数字的含义

则由系统决定。通常,非零(如 -1)代表程序运行中遇到某种错误而退出。

} <-函数体结束

函数体以闭大括弧 } 结束。

二、详细说明

现在,让我们进一步来了解每一行代码的含义。下面的内容很基础,也很重要, 必须认真弄懂,牢牢掌握。

1. #include 预处理指令和头文件

在编译器对我们写的源程序进行编译之前,预处理器会对我们的写的源代码

进行必要的处理,称为预处理。#include 就是一个预处理指令,它命令预处理器 进行的预处理是:把特定的头文件包含到我们的源代码里。

#include <stdio.h>的作用是将头文件stdio.h里的内容包含进我们的程序, 产生的结果是将stdio.h里的内容一字不漏地插入 #include <stdio.h>出现的

地方,并且删除 #include <stdio.h>。换句话说,就是用stdio.h里的内容替换

#include <stdio.h>。这个过程是在预处理阶段完成的。C 语言的这种包含文件的 机制为多个程序共享相同信息提供了极大的方便。

stdio.h是 C 语言标准中定义了的头文件,它包含着输入输出函数的信息。

所有 C 编译器都应该有这个头文件,这是 ANSI/ISO C 标准中规定的。当然,

ANSI/ISO C 规定的编译器必须提供的头文件可不止这么一个。标准还规定了许多 别的头文件,那些我们会在以后慢慢学到。

有些程序需要包含stdio.h,而有些不需要。如果上面这个例子中没有使用

printf函数,那就不需要包含stdio.h。

头文件中包含着编译器进行编译时所需的信息。头文件中可能指明了函数名和

函数调用方法,但是这些函数的实现代码并不在头文件中,而是在预先编译好了的 库文件里。

链接器负责在库文件中寻找我们的程序所需的代码,并且把那些代码和我们写的 程序进行链接,从而将我的写的程序链接成可执行文件。一句话,头文件用于指导 编译器正确地将我们写的源程序编译成可执行文件。

2. main 函数

在 C 语言中,main 函数是主函数。每个 C 程序都必须有且只能有一个

main 函数(主函数)!C 程序从 main 函数开始执行,并且在 main 函数中结束。 int是 main 函数的返回值类型,它表明 main 函数应该返回一个整数给程序的

调用者(如操作系统)。

如果您想了解更多关于 main 函数的东西,请点击下面的链接:

C/C++ 误区一:void main

3. 注释

/* a simple program */

/* */ 之间的内容都是注释。对程序进行适当的注释可以帮助读者(包括您自己)

更快更好地理解您写的代码。注释可以在源程序中的任何地方书写。/* 和 */ 之间的 任何内容(包括 /* 和 */)都会被编译器忽略掉。注意:/ 和 * 必须紧挨在一起, 它们之间不能有空格。

c语言基础知识教程

/* 我是注释 */

/*我是

跨行注释*/

/*

我也是注释

*/

以上的注释都是合法的;但下面的注释是非法的,因为没写注释结束标记 */。

/* 非法,没有注释结束标记

下面这个注释可能会出乎你的意料:

/* 我是注释开始标记

/* 哦哦,我不是注释开始标记

我是注释结束标记,我和第一个 /* 匹配,而不是和第二个 /* 匹配。*/

上面这个注释中,注释结束标记 */ 和第一个 /* 匹配,它们之间的内容

都被视为注释。

C99 中增加了另外一种注释方式,这种注释方式使用 // 作为注释符,和 // 处于同一行,并且在 // 右边的内容都被当作注释。/ 和 / 之间不能有空格。

// 我是注释

intrigue;//注释放在这里也是合法的

上面的注释在 C99 中是合法的,但是在 C89 中是非法的。也就是说,老旧的

编译器可能不支持 // 注释符。VC6 支持 //,TC2 不支持。

4. 大括号与函数体

C 语言中,所有函数都以大括弧({ })作为界定符。函数体从开大括弧 { 开始,以闭大括弧 } 结束。在后续教程中,我会对函数进行更详细的讲解。

5. intnum;

这个语句声明了变量num。这一行末尾的分号(;)表明这一行

是一个语句。; 是语句的一部分,单独一个 ; 也是一个合法的 C 语句。

int是 C 语言中的一个关键字,它代表 C 语言里的一种基本数据类型:整型。

关键字是语言的保留字,不能用作其它用途。例如:我们不能关键字来做变量名或者 函数名。

标识符是指我们为变量或函数等取的名字。在这个语句中,num就是标识符。

C 语言中,所有变量在使用前都必须声明。C89 中,变量的声明必须位于 函数体或者程序块的开端。例如:

int main( void ) /* C89 */

{ /* 函数体开始 */

int doors;

int dogs;

doors = 5;

dogs = 3;

{ /* 程序块开始 */

int dig;

int dug;

dig = 6;

dug = 8;

} /* 程序块结束 */

return 0;

} /* 函数体结束 */

而在 C99 中,声明可以位于函数体或者程序块的任何地方。但是,变量仍然 需要在声明之后才可使用。例如:

int main( void ) /* C99 */

{ /* 函数体开始 */

int doors;

doors = 5;

{ /* 程序块开始 */

int dig;

dig = 6;

int dug;

dug = 8;

} /* 程序块结束 */

int dogs;

dogs = 3;

return 0;

} /* 函数体结束 */

上面的程序在 C99 中是合法的,但是在 C89 中却是非法的。当前支持C99 的 编译器不多,所以上面的代码您的编译器很有可能编译不了。故而,为了使我们的 代码具有良好的可移植性,我们应该尽可能少用,甚至不用 C99 中的新特性。

6. 赋值

num = 1;

赋值是 C 语言中的一种基本操作。上面的语句是一个赋值语句,它的含义 是:将 1 赋值给变量num。赋值操作完成后,num的值等于 1 。

7. printf函数

printf( "This is a simple C program. " );

printf( "My favorite number is %d because it is first. ", num );

这两行代码都调用了printf函数。printf是一个标准 C 函数,也就是说,

它是 C 语言标准函数库里定义了的函数。圆括号 () 表明printf是一个函数,

篇二:C语言程序设计基础教程

C语言程序设计

谢利东

目录

绪论 .................................................................................................................................................. 2

第01讲 C语言概述 ..................................................................................................................... 2

第02讲 基本数据类型 ................................................................................................................... 3

第03讲 运算符 ............................................................................................................................. 6

第04讲 流程控制 ....................................................................................................................... 10

第05讲 数组 ............................................................................................................................... 18

第06讲 函数 ................................................................................................................................. 21

第07讲 算法设计范例 ................................................................................................................. 24

第08讲 自我检测(含答案) ..................................................................................................... 28

绪论

一、 课程简介

课程内容:C语言程序设计基础知识

适用对象:程序设计初学者

二、 课程目标

1、 了解程序设计的相关知识

2、 掌握C编程

3、 理解程序设计语言的基本构成要素

4、 掌握算法设计

第01讲 C语言概述

一、 程序设计语言的发展

1、 机器语言:是唯一能被计算机直接解释和执行的语言

2、 汇编语言:与机器语言相似,但加入了助记符 Add a,b a+b

3、 面向过程的语言:自助游,需理解细节;Basic、C

4、 面向对象的语言:找旅行社,无需理解细节;C++、Java、C#

二、 C语言简介

三、 编写实例:Hello

main()

{

printf( “Hello,C! ”);

}

四、 在Turboc中编写运行C程序的步骤

1、 启动TC

2、 执行Alt+F,进入File菜单,执行New,新建源文件

3、 输入代码并保存 ——编辑

执行Alt+F,进入File菜单,执行Save,保存源文件

4、 执行Alt+C,进入Compile菜单,执行“Compile to OBJ”

若代码有错,需纠错 ——编译

5、 执行Alt+C,进入Compile菜单,执行“Make EXE File” Ctrl+F9 若代码有错,需纠错 ——连接

6、 执行Alt+R,进入Run菜单,执行“Run”——执行

7、 执行Alt+F5,查看运行结果,查看完后按下Enter,返回编辑环境 说明:

(1) 编写C程序的步骤:P4

(2) 实际运行中,可通过快捷键简化一些操作

五、 C程序的基本构成

第02讲 基本数据类型

一、 数据类型简介

1、 什么是数据类型?

对数据的“抽象”12、13、45、1.2、1.56、0.4e6、RuiLi、DaLi

2、 为什么要有数据类型

20040102 可以代表学号,属于字符

可以代表整数,属于数值

可以代表日期,属于日期时间

3、 C语言中有哪些数据类型?

P16

4、 基本数据类型

数值型、字符型、枚举型

二、 变量和常量

1、 变量:程序运行期间,值可能改变的量(Variation)

2、 常量:程序运行期间,值不会改变的量(Const)

例如:计算机出10道加法练习题

形式:7+5=?、8+9=?

第1个加数 加号 第2个加数 等号

op1+op2=result

第1次:op1=6,op2=7:6+7

第2次:op1=5,op2=8:5+8

??

控制题目数量:OPNUM=10

3、 常量类型

符号常量:通过#define 定义的常量

字面常量(直接常量):与变量相似,字面常理有整型、实型、字符型

3.14、3、RuiLi

三、 整型类型

1、 整型常量

形如3、4、67、890、5632的数据,可以赋给整型变量

2、 整型变量

(1) 短整型(short)

声明: short a ;

声明一个变量的格式:“ 数据类型 变量名 ;”

范围:占16位,范围为-32768—32767

(2) 整型(int)

声明:int a;

范围:占16位,范围为-32768—32767

(3) 长整型(long)

声明:long a;

范围:占32位,范围为-2147483648——2147483647

3、 实例练习1 Main函数 { 声明3个整型变量,a、b、sum 让a的值等于312 a=312;

让b的值等于789 b=789;

计算a加b的结果 printf(“ The sum of a add b is : %d \n”,sum); 将结果显示到屏幕上 }

4、 实例练习2——对上例的改进

main()

{

int a,b,sum; -----------------声明整型变量a,b,sum

printf (“ Please input two integers(a and b):\n”); ----------------提示输入两个整数 scanf(“%d,%d”,&a,&b); ---------要求输入两个整数,分别给a、b,两数间用逗号隔开,例如3,5 sum=a+b; -------------计算a、b之和

printf(“Sum=%d\n”,sum); -----------将结果输出到屏幕上

}

四、 实型类型

1、实型常量

形如1.2、0.5、0.0023、1.0、2.0的数据,可以赋给实型变量

2、实型变量

(1) 单精度(float)

声明:float a;

范围:占32位, -3.4*10-38— 3.4*1038 ,6位精度

(2) 双精度(double)

声明:double a;

范围:占64位,-1.7*10-308—1.7*10308 ,16位精度

3、实型常量的表示

十进制小数:如 .123、123.、0.123、123.0、0.0

指数形式(规范化):1.23e6或1.23E6——1.23*106

0.123e7或0.123E7 非规范化

12.3e5或12.3E5非规范化

4、 实例练习——输入3个数(整数或小数均可),求平均

分析:输入的3个数可以是整数,也可是小数,故只能声明为实型整数:1.0

代码:

main()

{

float x1,x2,x3,average; -------------------声明4个实型变量,分别输入的3个数和平均值printf(“Please input three float data:\n”); -----------提示输入3个实型数据scanf (“ %f , %f , %f”,&x1,&x2,&x3); ------输入3个实型数据,分别给x1、x2、x3,逗号隔开average=(x1+x2+x3)/3;-------求平均值

printf(“Average=%f\n”,average); --------输出结果

}

五、 字符型

1、字符常量

表示:?x?(用单引号,不能是双引号;只能有一个字符)

例如:?a?、?b?表示字符常量a和b

转义字符:系统定义,有特殊含义的字符

\n——换行;\b——退格,前移一列

\t——下跳一制表位,后移8列

2、字符串常量

表示:”a dog” (用双引号,不能用单引号;可以放多个字符) 例如:”a dog” 表示字符串a dog,由5个字符组成

3、字符变量

声明:char c;

注意:一个字符变量只能存放一个字符常量,即

c=?a? ,正确;

c=”a dog”,错误

4、实例1——字符常量及转义字符的使用

main()

{

printf(“\n\n”); --------------将当前屏幕换行2次,以方便查看结果 printf(“no break:a dog”); ------------不加\n的效果

printf(“\n”); ------------换行,以便比较结果

printf(“ a break:a \n dog”); ------加\n的效果

printf(“\n”); ------------换行,以便比较结果

printf(“no reback:a dog ”); -------不加\b的效果

printf(“\n”); ------------换行,以便比较结果

printf(“a reback:a\bdog ”); -------加\b的效果

printf(“\n”); ------------换行,以便比较结果

printf(“a tab:a \t dog”)-----------------加\t 的效果

}

5、 实例2——字符变量的使用

main()

{

篇三:C语言基础知识重点和难点

C语言基础知识重点和难点

一、数组

1. 一维数组的定义与初始化

1) 不能在方括号中用变量来表示元素的个数,但是可以是符号常数或常量表达式。 例如:

#define FD 5

main()

{

int a[3+2],b[7+FD];

……

}

是合法的。

但是下述说明方式是错误的。

main()

{

int n=5;

int a[n];

……

}

2) C语言对数组的初始化赋值还有以下几点规定:

(1) 可以只给部分元素赋初值。

当{ }中值的个数少于元素个数时,只 给前面部分元素赋值。

例如:

int a[10]={0,1,2,3,4};

表示只给a[0]~a[4]5个元素赋值,而后5个元素自动赋0值。

(2) 只能给元素逐个赋值,不能给数组整体赋值。

例如给十个元素全部赋1值,只能写为:

int a[10]={1,1,1,1,1,1,1,1,1,1};

而不能写为:

int a[10]=1;

(3) 如给全部元素赋值,则在数组说明中,可以不给出数组元素的个数。 例如:

int a[5]={1,2,3,4,5};

可写为:

int a[]={1,2,3,4,5};

2. 一维数组元素的引用

1) 在C语言中只能逐个地使用下标变量,而不能一次引用整个数组。 例如,输出有10个元素的数组必须使用循环语句逐个输出各下标变量: for(i=0; i<10; i++)

printf("%d",a[i]);

而不能用一个语句输出整个数组。

下面的写法是错误的:

printf("%d",a);

2) 引用数组元素时一定注意下标不能越界

例如,int i=4, n[]={0,0,0,0,0};,

则可以引用n[0],n[4],n[!5],n[i++],但不能引用n[5], n[++i]

例1:若有定义语句:int m[ ]={5,4,3,2,1},i=4; ,则下面对m数组元素的引用中错误的是___C___。

A、m[--i] B、m[2*2] C、m[m[0]] D、m[m[i]]

3. 一维数组的典型算法

1)

2)

3)

4)

5)

6) 查找指定的元素,返回其下标。比如,要求查找数值5是否数组中 查找数组的最大(最小)值,并返回最大(最小)值及其对应的下标 数组的排序(升序或降序),包括冒泡排序和选择排序两种算法 在有序数组中插入一个元素,使得数组仍然有序 数组的逆序 在数组中删除满足某条件的元素

4. 二维数组的初始化

二维数组初始化也是在类型说明时给各下标变量赋以初值。二维数组可按行分段赋值,也可按行连续赋值。

例如对数组a[5][3]:

1)按行分段赋值可写为:

int a[5][3]={ {80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85} };

2) 按行连续赋值可写为:

int a[5][3]={ 80,75,92,61,65,71,59,63,70,85,87,90,76,77,85};

对于二维数组初始化赋值还有以下说明:

1) 可以只对部分元素赋初值,未赋初值的元素自动取0值。

例如:

int a[3][3]={{1},{2},{3}};

是对每一行的第一列元素赋值,未赋值的元素取0值。 赋值后各元素的值为:1 0 0

2 0 0

3 0 0

int a [3][3]={{0,1},{0,0,2},{3}};

赋值后的元素值为:

0 1 0

0 0 2

3 0 0

2) 如对全部元素赋初值,则第一维的长度可以不给出。

例如:

int a[3][3]={1,2,3,4,5,6,7,8,9};

可以写为:

int a[][3]={1,2,3,4,5,6,7,8,9};

例1:以下不能正确定义二维数组的选项是___D___。

A、

B、int a[][2]={1,2,3,4}; C、int a[2][2]={{1},2,3}

D、

5. 二维数组元素的引用

和一维数组一样,一定要注意下标不越界。

例1:若有定义

int a[2][3];

以下选项中对a数组元素正确引用的是A)a[2][!1] B)a[2][3]

C)a[0][3] D)a[1>2][!1]

6. 字符数组的初始化

1) 字符数组也允许在定义时作初始化赋值。

例如:

char c[10]={‘c’, ‘ ’, ‘p’, ‘r’, ‘o’, ‘g’, ‘r’, ‘a’,’m’};

赋值后各元素的值为:

数组C c[0]的值为‘c’

c[1]的值为‘ ’

c[2]的值为‘p’

c[3]的值为‘r’

c[4]的值为‘0’

c[5]的值为‘g’

c[6]的值为‘r’

c[7]的值为‘a’

c[8]的值为‘m’

其中c[9]未赋值,由的值为‘p’系统自动赋予0值。

当对全体元素赋初值时也可以省去长度说明。

例如:

char c[]={`c`,` `,`p`,`r`,`o`,`g`,`r`,`a`,`m`};

这时C数组的长度自动定为9。

在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。前面介绍字符串常量时,已说明字符串总是以'\0'作为串的结束符。因此当把一个字符串存入一个数组时,也把结束符'\0'存入数组,并以此作为该字符串是否结束的标志。有了'\0'标志后,就不必再用字符数组的长度来判断字符串的长度了。

2) C语言允许用字符串的方式对数组作初始化赋值。

例如:

char c[]={'c', ' ','p','r','o','g','r','a','m'};

可写为:

char c[]={"C program"};

或去掉{}写为:

char c[]="C program";

用字符串方式赋值比用字符逐个赋值要多占一个字节, 用于存放字符串结束标志'\0'。上面的数组c

‘\0'是由C般无须指定数组的长度, 而由系统自行处理。

7. 字符串处理函数

用于输入输出的字符串函数,在使用前应包含头文件"stdio.h",使用其它字符串函数则应包含头文件"string.h"。

1) 输出函数 puts

2) 输入函数gets:gets读入字符串时,可以读入其中的空格,直到回车。而用scanf读入字

符串时,遇到空格即停止。

3) 连接函数strcat:格式为strcat (字符数组名1,字符数组名2),一定注意,字符数组1

一定要足够大,否则将越界。

4) 拷贝函数strcpy:格式为strcpy (字符数组名1,字符数组名2)。注意,字符数组赋

值,不能用等于号,而要用strcpy函数

5) 比较函数strcmp:格式为strcmp(字符数组名1,字符数组名2)。注意,字符数组的比

较不能用大于、小于号比较。

测字符串长度函数strlen:测字符串的实际长度(不含字符串结束标志‘\0’) 并作为函数返回值。

二、函数

1. 形式参数和实际参数

1) 函数的形参和实参具有以下特点: 形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只有在函数内部有效。函数调用结束返回主调函数后则不能再使用该形参变量。

实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使实参获得确定值。

实参和形参在数量上,类型上,顺序上应严格一致,否则会发生类型不匹配”的错误。 函数调用中发生的数据传送是单向的。即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。

2) 3) 4)

下例可以说明这个问题。

int s(int n)

{

int i;

for(i=n-1;i>=1;i--)

n=n+i;

printf("n=%d\n",n);

}

main()

{

int n;

printf("input number\n");

scanf("%d",&n);

s(n);

printf("n=%d\n",n);

}

2. 数组作为函数参数

1) 数组元素作函数实参

数组元素就是下标变量,它与普通变量并无区别。 因此它作为函数实参使用与普通变

本文已影响