语言程序设计教学"/>
C语言程序设计教学
C语言程序设计教学
C语言程序设计教学
数据类型与运算符
- 变量的数据类型 :整形变量,实型变量,字符型变量,枚举类型变量; (单引号内只可以存放转义字符、一个字符)
数据类型 | 所占字符数 |
---|---|
char | 1个字节 |
int | 4个字节 |
short | 2个字节 |
- printf()函数与scanf()函数
(1) 常用printf()函数格式字符
用格式字符 | 含义 |
---|---|
%s | 输出一个字符串 |
%c | 输出一个字符 |
%d | 以十进制输出一个有符号整型 |
%u | 以十进制输出一个无符号整型 |
%f | 以十进制输出一个浮点数 |
- sizeof运算符可以获取数据字节数 : sizeof(数据类型名称或变量名称)
- eg:printf(“int: %d字节\n”,sizeof(int));
- 格式字符串一般形式:[标志][输出最小宽度][.精度][长度]类型
(2) scanf()函数
功能:接收用户输入,也可以通过格式控制字符控制用户输入
接收的是变量的地址 - scanf("%d,%d",&a,&b) 输入数据用逗号隔开
- scanf("%d%d",&a,&b) 输入数据用空格隔开
(3)算数运算符优先级
(4)位运算符
(5)关系运算符
(6)三目运算符
表达式1?表达式2:表达式3(若1为真,则为2,否则为3)
条件运算符方向:自右向左
eg:a>b?a:c>d?c:d应理解为a>b?a:(c>d?c:d),这也是三目运算符的嵌套
结构化设计程序
-
if语句
单分支结构:if…
双分支结构:if…else…
多分支结构:if…else if…else… -
switch条件语句(条件语句)
-
break语句(跳转语句)
终止当前循环,执行循环体外的第一条语句 -
continue语句(跳转语句)
中止本次循环,并继续执行下一次循环;
break语句可以用于switch语句,而continnue不可以; -
goto语句(跳转语句)
break语句出现在嵌套循环中的内层循环,只能跳出内层循环;如果想跳出外部循环则需要对外层循环添加标记,然后使用goto语句。 -
while循环语句与 do…while循环语句
循环条件的值非0,循环体就会被执行;循环体执行完毕时会继续判断循环条件,知道循环条件的值为0时,整个循环过程才会结束。 do…while循环语句与之类似。
不同的是,do…while循环体先执行后判断(while先判断后执行)
函数
- 函数的定义
函数包括 | 含义 |
---|---|
返回值类型 | 限定函数返回值的数据类型 |
参数名 | 函数的名称 |
参数类型 | 限定调用函数时传入函数中的数据类型 |
参数 | 接收传入函数中的数据 |
return关键字 | 用于结束函数,将函数的返回值返回函数调用处 |
返回值 | 被return语句返回的值 |
- 函数调用时的数据传递:形式参数,实际参数
- 内存四区:
(1)栈区: 对一个程序来说,栈区是一块连续的内存区域,该区域由编译器自动分配和释放,一般用来存放函数的参数、局部变量等,由于栈顶的地址和栈区的最大容量是由系统预先规定的,因此这块区域的内存大小固定。若申请的内存空间超过栈区的剩余容量,则系统会提示溢出。
(2)堆区:对一个程序来说,堆可以是不连续的内存区域,此段区域可以由程序开发者自主申请,其使用比较灵活,但缺点是同样需要程序开发人员自主释放,若程序结束时该段空间仍未被释放,就会造成内存泄露,最后由系统回收。
(3)数据区
根据其功能,数据区又可分为静态全局区和常量区两个城。
全局区是用于存储全局变量和静态变量的区域,初始化为非0的全局变量和静态变量在一块区域,该区域称为data段;未初始化或者初始化为0的全局变量和静态变量在相邻的一块区城,该区域称为bss段。该区域在程序结束后由操作系统释放。
常量区用于存储宇符事常量和其他常量,该区域在程序结束后由操作系统释放。
(4)代码区:代码区用于存放函数体的二进制代码。程序中每定义一个函数,代码区都会添加该函数的二进制代码,用于描述如何运行函数。当程序调用函数时,会在代码区寻找该函数的二进制代码并运行。 - 局部变量与全局变量
(1)局部变量:定义在函数内部的变量,变量的作用域仅限于函数内部,函数执行完毕以后这些变量就失去作用。
(2)全局变量:在所有函数(包括主函数)外部定义的变量成为全局变量,他不属于某个函数,而是属于源程序,因此全局变量可以为程序中的所有函数共用,他的有效范围是从定义开始处到源程序结束。
若在同一个文件中,局部变量和全局变量同名,则全局变量会被屏蔽,在程序的局部暂时使用局部变量保存的数据。 - 函数调用
(1)主函数调用普通函数
(2)嵌套调用
主函数可以调用其他普通函数,普通函数可以相互调用,但是不能调用主函数
(3)调用方式
调用方式 | 举例 |
---|---|
将函数作为表达式调用 | int a=max(1,2) |
将函数作为语句调用 | printf(“hello \n”); |
将函数作为实参调用 | printf("%d\n",max(1,2)); |
- 内部函数与外部函数
/ | 内部函数 | 外部函数 |
---|---|---|
关键字 | static | extern |
函数形式 | static 返回值类型 函数名(参数列表){} | extren 返回值类型 函数名(参数列表){} eg:extren int add(int a,int b){} |
意义 | 又被称为静态函数,指该函数仅在本文件有效 | 可省略extren,仍可被其他文件调用 |
数组
- 一维数组
(1)定义:数据类型 数组名[常量表达式];
eg:int array[5]; (占据内存大小为:5*sizefo(int))
(2)初始化常见方式:
方式 | 举例 |
---|---|
直接对数组中所有元素赋值 | int s[4]={1,2,3,4}; |
手机 | int s[5]={1,2} ; (其他元素的值会被默认设置为零) |
导管 | int[]={1,2,3} (系统会根据赋值号右边初始值列表给出的初值个数自动设置数组的长度) |
(3)引用方式:数组名[下标];
(4) 数组的非法操作
-
不能用已经初始化的数组为另一个数组赋值
eg:int a[3]={1,2,3}; int b[3]; y=x; -
不能对数组进行整体的输入输出,必须以元素为单位进行操作
printf()和scanf()只支持字符数组整体的输入输出 -
数组和数组之间不能进行比较,也不能进行运算
- 二维数组
(1)语法格式:类型说明符号 数组名 {常量表达式1}{常量表达式2};
(2)初始化
方式 | 举例 |
---|---|
按行给二位数组赋初值 | 对部分数组元素赋初值 |
将所有的数组元素按顺序写在一个大括号里 | int a[2][3]={1,2,3,4,5,6}; |
对部分数组元素赋初值 | int a[3][3]={{1},{2,3,4},{5,6}};(对没有赋值的元素,系统会自动赋值为0) |
二维数组的第一个下标可省略,第二个下标不可省略
指针
- 定义指针变量的语法格式:变量类型* 变量名(变量名前的符号‘*’表示该变量为一个指针)
eg:int *p - 指针变量的初始化
(1)接收变量的地址为其赋值,也可在定义时赋值
(2)与其他指针变量指向同一块存储空间
- 指针的引用
格式:*指针变量名
=只能使用间接访问的场合
场合 | 原因 |
---|---|
用户申请一块内存空间时 | 因为该空间没有对应的变量名,所以只能通过首地址对其进行访问 |
通过被调函数改变主调函数变量的值 | 由于值只能由实参向形参单向传递,所以被调函数无法通过改变形参的值去改变主调函数中变量的值,只能通过间接访问指针指向的内存空间来改变主调函数的值。 |
- 指针类型
(1)空指针(没有指向任一储存单元的指针)
一般编程时,先将指针初始化为空,在对其进行赋值操作
(2)无类型指针==(使用该指针为其他基类指针赋值,必须先转换成其他类型的指针,使用该指针,接收其他类型指针不需要强转)==
(3)野指针:指向不可用区域的指针。形成原因有以下两种:
- 指针变量没有被初始化。定义的指针变量若没有被初始化,则可能指向系统中任意一块存储空间,若指向的存储空间正在使用,当发生调用并执行某种操作时,就可能造成系统崩溃,因此在定义指针时应使其指向合法空间。
- 若两个指针指向同一块存储空间,指针与内存使用完毕之后,调用相应函数释放了一个指针与其指向的内存,却未改变另一个指针的指向,将其置空。此时未被释放的指针就变为野指针。
在编程时,可以通过“if(p==NULL){}"来判断指针是否指向空,但是无法检测该指针时否为野指针,所以要避免野指针的出现。
- 指针的交换
根据指针可以获得变量的地址,也可以得到变量的信息,所以指针交换包含两个方面,一是指针指向交换,二是指针所指地址中存储数据的交换。
( 1)指针指向交换
若要交换指针的指向,首先需要申请一个指针变量,记录其中一个指针原来的指向,再使该指针指向另外一个指针,使另外一个指针指向该指针原来的指向。
2)数据的交换
若要交换指针所指空间中的数据,首先需要获取数据,获取数据的方法在案例一中已经讲解,即使用“*”运算符取值。
更多推荐
C语言程序设计教学
发布评论