简单的C程序
预处理指令:在编译之前执行的指令,一般以 # 开头。
#include: 系统自带的文件用<>,自己写的文件用 "" 。
.h称为头文件,是用来声明一些常用的函数,假如想使用这些函数,就必须包含这个头文件。
main函数:整个C程序的入口点,一个C程序有且只有一个main函数,C程序main函数不写返回值类型不报错,默认返回int类型。
1 #include <stdio.h> 2 3 main() 4 {}
开发和运行C程序的步骤
编写程序——>编译——>链接(目标代码 & C语言函数库)——>生成可执行机器代码——>运行程序
编译:将C的源程序翻译成计算机可以识别的二进制形式的目标文件代码,由C的编译器完成。编译成功会生成目标文件,文件名跟源程序文件名一样,扩展名为".obj"。如果一个项目中有多个C源文件,编译成功则会生成多个.obj目标文件。
链接:将所有有关联的.obj目标文件和系统提供的C库函数等组合在一起生成可执行文件的过程,称为"链接"。
函数
函数的分类
1.主函数(main函数)。
2.开发人员自定义的函数
3.C语言提供的库函数。
函数的声明和定义
因为C语言是从上往下编译的,所以调用函数时需要在main函数前做一个声明。函数声明可以放在 .h 文件中,函数定义放在 .c 文件中。
函数的形参和实参
在定义函数时,函数名后面的 () 中定义的变量成为形参(形式参数),在调用函数时传入的值称为实参(实际参数)。
注意:能不能#include .c文件?
不能。因为.c文件是定义函数的,#include .c文件会有函数重复声明的问题,导致在链接阶段报错。
数据类型
空类型:void
基本数据类型:int(整形),float(单精度浮点型),double(双精度浮点型),char(字符型)
构造类型:数组,struct(结构体),union(共用体),enum(枚举)
指针类型
变量
存储计算过程中所用的值,必须先定义类型再使用。
定义变量类型,就是为了给该变量分配适当的存储空间,以便存放数据。
在C语言中,声明一个局部变量后,没有经过初始化赋值时可以使用的。不过不建议这样做,因为系统会随意给该变量赋值,得到的是一个垃圾数据。变量在使用前还是应该先初始化再使用。
类型修饰符
short |
短型 |
long |
长型 |
signed |
有符号型 |
unsigned |
无符号型 |
1. short和long可以提供不同长度的整形数,可以改变整形数的取值范围,short的取值范围是-32768~32767,long的取值范围是-2147483648~2147483647。
2. 数据的存储长度也会跟着变化。
3. 不同编译器环境下,取值范围和占用的长度是不一样的,ANSI \ ISO制订了以下规则:
- short跟int至少为16位(2字节)
- long至少为32位(4字节)
- short的长度不能大于int,int的长度不能大于long
- char一定为8位(1字节)
基本语句和运算
基本语句
循环语句:do while、while、for
条件语句:if、if-else、switch
goto语句
基本运算
算数运算符:+、-、*、/、%
关系运算符:<、<=、>、>=、==、!=
- 在C语言中,关系运算的结果为"真"就返回1,"假"就返回0。
- 在C语言中,任何非0值都代表"真",只有0值才为“假”。
逻辑运算符:&&、||、!
赋值运算符:=、+=、-=、*=、/=、%=
逗号运算符和逗号表达式:用逗号运算符连接起来的表达式称为逗号表达式;整个逗号表达式的值是最后一个表达式的值。
条件运算符和条件表达式(三目运算符):表达式1 ? 表达式2 : 表达式3
sizeof:用来计算一个变量或者一个常量、一种数据类型所占的内存字节数。
注意:
1 size_t size = sizeof(‘A‘);
这时size打印出来为4字节,因为‘A‘会被转成 int 型再拿去求所占字节数。应更改为:
1 char d = ‘A‘; 2 size_t size = sizeof(d);
数组
地址
- 计算机中的内存是以字节为单位的存储空间,内存中的每一个字节都有一个唯一的编号。这个编号就称为地址。凡存放在内存中的程序和数据都有一个地址,也就是说,一个函数也有自己的内存地址。
- 当定义一个变量时,系统会分配一个带有唯一地址的存储单元来存储这个变量。变量存储单元的第一个字节的地址就是该变量的地址。
一维数组
- 一维数组的定义:类型 数组名 [ 元素个数 ] 。
int a[10];
- [] 只能放在数组名的后面。
- [] 里面的个数必须是一个固定值,可以为常量、常量表达式。不能使用变量或者变量表达式来表示元素个数。
- 定义数组时,系统将按照数组类型和个数分配一段连续的存储空间来存储数组元素。
1 //查看数组的地址 2 int a[5]; 3 //第一种方式: 4 printf( "%d" , &a[0] ); 5 //第二种方式: 6 printf( "%d" , a );
数组名代表整个数组的地址,就是数组的起始地址,也就是第0个元素的地址。
一维数组与函数参数
-
- 一维数组的元素作为函数实参,于同类型的简单变量作为实参一样,是单向的值传递。形参的改变不影响实参。
- 如果一维数组的名字作为函数实参,传递的是整个数组,即形参数组与实参数组完全相同,指向的是同一片内存空间。在修改形参数组时,实参数组也会被改变。形参数组的元素个数可以省略。
二维数组
- 二维数组的定义:类型 数组名 [ 行数 ] [ 列数 ]
1 int a[2][3];
- 二维数组的存储:
-
- 可以把二维数组看成是一个一维数组的集合,也就是说二维数组是一个特殊的一维数组:它的元素是一维数组。
- 二维数组的存放顺序是按行的顺序进行存放的。
1 //查看二维数组的地址 2 int a[2][3] ; 3 //第一种方式: 4 printf( "%d" , &a[0][0] ); 5 //第二种方式: 6 //a[0] 也是个数组,所以 a[0] 就是数组名,就是代表着这个数组的地址 7 printf( "%d" , a[0] ); 8 //第三种方式: 9 printf( "%d" , a );
格式符
%.2f |
保留两位小数 |
%4d |
占用4个空格的空间 |
& |
取地址符 |