- 1.什么是C语言?
- 2.第一个C语言程序
- 3.数据类型
- 4.变量、常量
- 4.1定义变量的方法
- 4.2变量的分类
- 4.3变量的作用域和生命周期
- 4.4
- 5.字符串+转义字符+注释
- 5.1字符串
- 5.2转义字符
- 5.3注释
- 6.选择语句
- 7.循环语句
- 8.函数
- 9.数组
- 9.1数组的定义
- 9.2数组的下标
- 10.操作符
- 11.常见关键字
- 11.1关键字typedef
- 11.2关键字static
- 11.3关键字#define
- 12指针
- 12.1内存
- 13.2指针变量的大小
- 14结构体
本章重点:
- 什么是C语言
- 第一个C语言程序
- 数据类型
- 变量、常量
- 字符串+转义字符+注释
- 选择语句
- 循环语句
- 函数
- 数组
- 操作符
- 常见关键字
- define 定义常量和宏
- 指针
- 结构体
C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。C语言能以简易的方式编译、处理低级存储器。C语言是仅产生少量的机器语言以及不需要任何运行环境支持便能运行的高效率程序设计语言。尽管C语言提供了许多低级处理的功能,但仍然保持着跨平台的特性,以一个标准规格写出的C语言程序可在包括类似嵌入式处理器以及超级计算机等作业平台的许多计算机平台上进行编译。
C语言的主要特点:
- 简洁的语言
- 具有结构化的控制语句
- 丰富的数据类型
- 丰富的运算符
- 可对物理地址进行直接操作
- 代码具有较好的可移植性
- 可生成高质量、目标代码执行效率高的程序
#include3.数据类型int main () { printf("hello world!n"); return 0; } //main是程序的入口 //一个工程中main函数有且仅有一个
#include4.变量、常量int main() { printf("%dn", sizeof(char));//字符型 printf("%dn", sizeof(short));//短整型 printf("%dn", sizeof(int));//整形 printf("%dn", sizeof(long));//长整型 printf("%dn", sizeof(long long));//更长的整型 printf("%dn", sizeof(float));//单精度浮点数 printf("%dn", sizeof(double));//双精度浮点数 printf("%dn", sizeof(long double)); return 0; }
**变量:**值可变 (比如:年龄、体重、薪资)
**常量:**值不可变 (比如:圆周率、性别、身份证号码)
int age = 20; char ch = 'w'; float weight = 50.5f;4.2变量的分类
- 局部变量
- 全局变量
int global = 2019;//全局变量
int main()
{
int local = 2020;//局部变量
int global = 2020;//局部变量和全局变量都定义时,局部变量优先
printf("%dn", global);
return 0;
}
总结:
局部变量和全局变量同名时,局部变量优先使用
作用域
作用域(scope)是程序设计概念,一般来说,一段代码中所用到的名字并不是总是有效/可用的,而限定限定这个名字的可用性的代码范围就是作用域。
- 局部变量的作用域是变量所在的局部范围。
- 全局变量的作用域是整个工程,可跨文件调用。
生命周期
变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段。
- 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
- 全局变量的生命周期:整个程序的生命周期。
int main()
{
int j = 0;
for (int i = 0; i < 100; i++)
}
像上述代码片段中,j 的作用域是main函数,生命周期也是main函数
i 的作用域是for循环,生命周期也是for循环,for循环结束后,i 就被销毁
常量
C语言中的常量分为以下几种:
- 字面常量
- const修饰的常量
- #define修饰的常量
- 枚举常量
enum sex
{
male = 0,
female = 0,
};//枚举常量
#define MAX 100;//宏定义常量
int main()
{
3.14159;//字面常量
const float pai = 3.14;
//const修饰的常量,不可被直接修改
}
5.字符串+转义字符+注释
5.1字符串
注:
字符串的结束标识是 的转义字符, 是结束标志,不算作字符串长度
C语言中用字符数组来存储字符串
int main()
{
char arr1[] = "bit";
char arr2[] = { 'b','i','t' };
char arr3[] = { 'b','i','t' ,' ' };
printf("%sn %sn %sn ", arr1, arr2, arr3);
}
用单个‘字符’表示的时候必须加上 ,否则会像第二种出现乱码
5.2转义字符| 转义字符 | 释义 |
| ? | 在连续书写多个问号时使用,防止被解析成3字母词 |
| ’ | 用于表示字符常量‘’ |
| " | 用于表示字符串内部的双引号 |
| 用于表示一个反斜杠,防止它被解释为一个转义序列符 | |
| a | 警告字符 |
| b | 退格符 |
| f | 进纸符 |
| n | 换行 |
| r | 回车 |
| t | 水平制表符 |
| v | 垂直制表符 |
| ddd | ddd表示1·3个八进制的数字 |
| xdd | dd表示2个十六进制的数字 |
笔试题:
试猜想会打印出什么?
#includeint main() { printf("%dn", strlen("abcdef")); printf("%dn", strlen("c:test628test.c")); }
第一行有6个字符,所以打印了6
第二行t、62都是一个字符,总共是14个,所以打印14
可注释多行代码
缺陷:不能嵌套注释
//注释一行代码,或在某行代码后添加注释
- if语句
- switch语句(多分支选择)
int main()
{
int cpding = 0;
printf("你会敲代码吗:1或0n");
scanf("%d", &cpding);
if (cpding == 1)
printf("坚持,你会有好offer");
else
printf("放弃,回家卖红薯");
}
7.循环语句
- while
- for
- do while
int main()
{
printf("加入比特n");
int line = 0;
while (line <= 20000)
{
line++;
printf("敲代码n");
}
if (line > 20000)
printf("good offer");
}
8.函数
#includeint add(int x, int y) { return x + y; } int main() { int temp1 = 125; int temp2 = 80; int sum = add(temp1, temp2); return sum; }
形如上述的add就是我们的自定义函数,可用来使函数模块化,提高代码的可读性,同时也便于我们修改代码
特点:简化代码,代码复用
数组的定义:一组同类型的元素的集合
9.1数组的定义int arr[10] = {1,2,3,4,5,6,7,8,9,10};
//定义一个整形数组,最多存放十个元素
重点:
【】里只能是数字,不能是自己定义的变量或常量
| int a[1] | 1 |
| 下标 | 0 |
数组下标永远从0开始 ,最大值为n-1;
一般数组的输入与输出用循环语句来操作
int main()
{
int a[10];
for (int i = 0; i < 10; i++)
scanf("%d", &a[i]);
for (int i = 0; i < 10; i++)
printf("%dt", a[i]);
}
10.操作符
算术操作符
| + | 加法运算符 |
| - | 减法运算符 |
| * | 乘法运算符 |
| / | 除法运算符 |
| % | 取余运算符 |
移位操作符
| << | 左移一位操作符 |
| >> | 右移一位操作符 |
位操作符
& ^ |
赋值操作符
= += -= *= /= &= ^= |= >>= <<=
单目操作符
| ! | 逻辑非 |
| - | 负值 |
| + | 正值 |
| & | 取地址 |
| sizeof | 计算字节数 |
| ~ | 对一个数的二进制按位取反 |
| - - | 前置、后置– |
| ++ | 前置、后置++ |
| * | 间接访问操作符(解引用操作符) |
| (类型) | 强制类型转换 |
逻辑操作符
| && | 逻辑与 |
| || | 逻辑非 |
关系操作符
> >= < <= != ==
条件操作符
exp1?exp2:exp3
逗号表达式
exp1,exp2,exp3
运算结果只取最后一个
下标引用、函数调用和结构成员
[] () . ->11.常见关键字
| auto | 声明一个变量为自动变量,仅限局部变量 |
| break | 终止循环或switch语句 |
| case | 分支 |
| const | |
| continue | |
| default | 若与其他case不匹配,则用default |
| do | 执行程序 |
| enum | 枚举 |
| extern | 说明变量或函数是在其他文件定义的,在此文件引用 |
| goto | 无条件跳转语句 |
| register | 将变量存于CPU的寄存器中,不能取地址 |
| static | 声明静态变量 |
| typedef | 给数据类型重命名 |
| union | 声明联合体 |
| unsigned | 无符号 |
| volatile | 确保不会因编译器的优化而省略 |
类型重命名
#typedef int ElemType;
把int重命名为ElemType
11.2关键字static- 修饰局部变量----静态局部变量
- 修饰全局变量----静态全局变量
- 修饰函数----------静态函数(使函数只能在源文件用,不能被其他文件引用)
//define定义标识符常量 #define MAX 100 //define定义宏 #define ADD(x,y) ((x)+(y))12指针 12.1内存
计算机程序都是在内存中进行的,所以为了有效的使用内存,把内存划分成一个个小小的内存单元,每个内存单元的大小是一个字节,为了能够有效的访问到内存的每个单元,给这些内存单元进行了编号,这些编号称为内存单元的地址。
| 内存 | |
| 一个字节 | 0xFFFFFFFF |
| 一个字节 | 0xFFFFFFFE |
| … | |
| 一个字节 | 0x00000002 |
| 一个字节 | 0x00000001 |
| 一个字节 | 0x00000000 |
变量是创建在内存中的,每个内存单元都有地址,所以变量也是有地址的,
取变量的地址如下:
#includeint main() { int num = 10; //num的地址为4个字节,取出的是第一个字节的地址 printf("%pn", &num);//%p是以地址的形式打印 return 0; }
| 内存 | |
| 一个字节 | 0xFFFFFFFF |
| 一个字节 | 0xFFFFFFFE |
| num1 | 0x0012ff47 |
| num2 | 0x0012ff46 |
| num3 | 0x0012ff45 |
| num4 | 0x0012ff44 |
| 一个字节 | 0x00000002 |
| 一个字节 | 0x00000001 |
| 一个字节 | 0x00000000 |
地址如何存储,需要定义指针变量
int num = 10; int *p = #13.2指针变量的大小
#include14结构体//指针变量的大小取决于地址的大小 //32位平台下地址是32个bit位(即4个字节) //64位平台下地址是64个bit位(即8个字节) int main() { printf("%pn", sizeof(char *)); printf("%pn", sizeof(short *)); printf("%pn", sizeof(int *)); printf("%pn", sizeof(double *)); return 0; }
结构体是一种数据结构,是多种数据类型的结合
例如:
struct stu
{
char name[20];//名字
int age;//年龄
char sex[5];//性别
int id[15];//学号
};
结构体的初始化:
struct stu s = { "张三", 20, "男", "20200101" };
printf("name = %s age = %d sex = %s id = %s", s.name, s.age, s.sex, s.id);
return 0;
本章完



