第一章 基本知识梳理
一、C程序结构
1、C不提供输入输出语句,需要采用函数的形式
#include <stdio.h>
#include “stdio.h”
• #:预处理标志符
• include:文件包含
• stdio.h:扩展名为.h的是头文件,标准输入输出函数库
• <>和"":搜索路径不同,<>是系统路径下查找,""先在当前目录下查没有再去系统路径
2、注释://单行注释 /* */多行注释
3、C程序的特点
(1)1个C程序由一个或多个源文件(.C)构成
(2)函数是c程序的基本组成单位,每个源文件可包含若干函数
(3)一个c程序必须且只包含一个main( ),从main开始执行并结束于main
4、C程序的运行
编辑源文件.c——编译成目标程序.obj——链接成可执行程序.exe——执行
5、数据在内存的存放方式
①原码、反码、补码
正数:原码=反码=补码
负数:原码:该数的二进制
反码:符号位不变,按位取反
补码:符号位不变,反码+1
②存放方式
整型:二进制补码形式,4个字节
字符型:ASCII,1个字节
③数值范围
假设整型占2字节:-32768~32767 无符号数:0~65535
二、基本数据类型
1、数据类型
整型、字符型、实型、枚举
2、标识符、常量和变量
(1)标识符的命名规则
①只能包含字母、数字、下划线,不能以数字开头
②不能使用关键字
main、integer不是关键字
C没有I/O函数,printf等不属于C的关键字
③区分大小写,最好取具有一定意义的
(2)常量
程序运行过程中其值不能改变的量
(3)变量
其值可以改变的量
①注意以下规则
• 同级变量不可重名
• 变量必须先定义后使用
②变量类型
整型、字符型、实型、指针
③在内存中的存放形式
整形:补码 字符型:ASCII码 实型:无精确值
④变量初始化:定义的同时赋值
变量必须先定义在使用,没有初始化的值为随机数
3、各种类型数据混合运算结果为高类型
4、强制类型转换
格式:(类型名) 表达式
注意(float) 22/5 与(float)(22/5)不同
(float) 22/5:把22转为22.0再除5=4.4
(float)(22/5):把22/5的值转为实型=4.0
三、运算符和表达式
1、运算符
2、结合性
右结合:单目、三目(条件运算符)、赋值
左结合:除了右结合剩下的都是左结合
3、优先级(由高到低依次排列)
第二章 编程部分
一、C语句的分类
二、标准输入输出函数
1、输入输出函数
注:连续输入多个字符时,中间不用空格或回车
2、格式输入输出函数
(1)printf()
①一般形式:printf("格式控制字符串",输出表列)
②格式控制字符串
%m:指定输出宽度
• 数据宽度>m,按实际宽度输出
• -m左对齐右补空格,+m右对齐左补空格
%.nf:指定小数位数,采用四舍五入,小数点后默认6位
%.ns:对于字符串来说就是取多少个字符
(2)scanf()
①一般形式:scanf("格式控制字符串",地址列表)
②数字之间没有普通字符时可以通过空格、回车、tab键分隔
三、程序的三种基本结构
1、程序结构
if、for、while默认只负责一条语句
2、continue和break的区别
- continue:结束本次循环,执行下次循环
- break:结束整个循环,还可用于switch语句
第三章 数组
一、数组的概念
数组:具有相同数据类型的变量集合
数组名是数组的首地址,是常量
在内存中连续存放,二维数组按行存放
数组元素只能分别赋值,不能整体赋值
• 先定义后赋值和初始化的区别
-先定义后赋值:数组元素的值是随机数
-初始化:没赋值的元素默认为0或/0
• 对全部数据赋值
-一维:可以省略下标
-二维:只能省略一维下标
• 单个字符赋值没有\0,字符串赋值有\0
char c[]=''a'',''b'',''c'' //单个字符赋值没有/0
char c[]=''abc'' //字符串赋值有/0
• 数组不能整体使用
int a[3];
scanf(“%d”,a) //错误,a是常量
a={123} //错误,a是常量不能赋值,等号左边必须是变量
必须一个个元素赋值
二、数值数组
注:未初始化元素值随机
1、一维数组
(1)定义
类型 数组名[整型常量表达式]
(2)引用
数组名 [下标,从0开始到n-1]
2、二维数组
(1)定义
类型 数组名[常量表达式1][常量表达式2]
(2)初始化
类型 数组名[常量表达式1][常量表达式2]={{值},{值}}
注:可以省略行标
三、字符数组
1、定义
char 数组名[数组长度]
2、引用
数组名 [下标]
3、初始化
单个字符赋值没有\0,字符串赋值有\0
未初始化元素值为\0
四、字符串处理函数
1、字符串输入函数
①scanf("%s",字符数组)
• 输入的字符串里不能包含空格回车TAB
• 末尾自动加\0
• 输入串长度应小于字符数组长度
②gets()
• 输入的字符串里可以包含空格
• 末尾自动加\0
• 以回车结束
• 输入串长度应小于字符数组长度
2、字符串输出函数
①printf("%s",字符串地址)
• 依次输出字符串中的字符遇到\0结束
char c[10]=''abc''
printf("%s",&c[1]) //bc
②puts(字符串地址)
• 输出完字符串能自动换行
第四章 函数
一、函数定义
不能嵌套定义,可以嵌套调用
1、无参函数定义
类型 函数名() { ... }
2、有参函数定义
类型 函数名([形参])//函数返回类型没有定义时默认为int型
{
声明部分
执行部分
[return 表达式] //如果有返回值通过return返回
}
注:形参中必须分别定义两个形参的数据类型
二、函数的调用
1、主调函数:主动去调用其它函数
被调函数:被其它函数所调用
主函数可以调用子函数,子函数可以调用子函数,但子函数不可以调用主函数
2、 函数必须先定义或声明后才能被调用
(1)声明
被调函数在主调函数之后
①被调函数首部加分号
int max(int x,inty );
②int max (int,int);
(2)定义
被调函数在主调函数之前(如:int max()在main()函数前)
3、函数调用的一般形式
(1)有返回值的函数调用
①函数表达式
x=函数名(实参)//x=max(m,n)
②作为函数参数
printf("%d",max(x,y))
(1)无返回值的函数调用
void 空类型
函数名(实参)
三、函数的参数
- 实参与形参在数量、顺序要一致
- 没有函数调用时,形参不占用内存;函数调用时,为形参分配内存。形参与实参占用不同的内存单元,调用函数执行后,形参释放内存
- 函数的返回值最高只有1个
传址:数组名、指针
第五章 变量的作用域与存储类型
一、变量的作用域
二、存储类型
第六章 指针
一个变量的地址
一、定义
类型 *变量名 //带数据类型的一定是定义
二、赋值
1、初始化
类型 *变量名=&地址名;
注:未初始化的是野指针,不能用
2、赋值
类型 *变量名;
变量名=&地址名;
三、指针与数组
数组名是数组的首地址 常量不能参予运算 无&
1、一维
(1)地址
&a[i] &p[i] a+i p+i p++
(2)数值
a[i] p[i] *(a+i) *(p+i) *(p++)
(3)几个式子的含义
*p++:等价于*(p++) //*单目右结合
(*p)++:内容加加 //先输出内容在加加
2、二维
(1)元素
*(a[i]+j):a[i][j]的元素
*(*(a+i)+j):a[i][j]的元素
(2)地址
a[i]:a[i][0]行
a[i]+j、*(a+i)+j:a[i][j]的地址
注:二维数组地址有一个* 元素有两个*或*[]、[][]
一维数组地址无* 元素有一个*
a[i][j]=*(p+i*列数+j)
(3)理解与区分
( *p)[m]:指向含有m个元素的一位数组
//指针移动一行
(4)重要结论
int a[3][4],(*)p[4];p=a;
&a[i][j]=a[i]+[j]=p[i]+j=*(a+i)+j=*(p+i)+j
a[i][j]=*(a[i]+[j])=p[i][j]=*(*a+i)+j)=*(*p+i)+j)
注:指向字符数组时可修改字符数组内容
指向常量字符串时不可修改
第七章 结构体与共用体
- int型16位机2字节 32位机4字节
- 结构体内存:所有成员加在一起
- 共用体内存:成员最大字节数
一、结构体
1、结构体:自定义数据类型,把不同数据类型组合成一个整体
2、结构体的定义
struct 结构体类型名
{
成员表列;
};
2、结构体变量/数组/指针的定义、初始化和成员引用
(1)结构体变量/数组/指针的定义
①先定义结构体类型在定义变量名
struct 结构体类型名
{
成员表列;
};
struct 结构体类型名 变量名/数组名[ ]/*指针名
②定义结构体类型的同时定义变量名
struct 结构体类型名
{
成员表列;
}变量名/数组名[ ]/*指针名
③直接定义结构体类型变量(无结构体名)
struct
{
成员表列;
}变量名/数组名[ ]/*指针名
(2)结构体变量/数组/指针的初始化
什么类型的变量给什么类型的初值
各成员与值一一对应
(1)结构体变量/数组/指针的引用
结构体变量名.成员名
(*指针名).成员名
指针->成员名
二、共用体
是指几个不同的变量占用同一段内存的数据类型
1、共用体的定义
union 共用体类型名
{
....
};
2、知识点
• 同一内存在每一瞬时只能存放其中一种类型的成员
• 起作用的是最后一次存放的成员
• 只能对第一个成员初始化
三、类型定义符typedef
可以自己定义类型名(相当于重命名)
typedef 原类型名 新类型名