1 什么是C语言
一句话:人和计算机交流的语言。
2 第一个C语言程序
如何使用VS2019并创建空项目、源文件
int 整型 printf 打印函数(是C语言标准库中提供的一个库函数)
运行:
ctrl+F5
可以在newc++file.cpp 这个文件中加入:#define _CRT_SECURE_NO_WARNINGS 1
3 数据类型
>sizeof 是一个操作符,是计算变量的大小的
>计算机常见的单位:bit byte KB MB GB TB PB
>类型的使用
创建变量时同时给一个初始值 例如int m=0
4 变量、常量
4.1 定义变量的方法
4.2 变量的命名
只能由字母(包括大写和小写)、数字和下划线( _ )组成。
不能以数字开头。
长度不能超过63个字符。
变量名中区分大小写的。
变量名不能使用关键字。
4.3 变量的分类
1、局部变量
2、全局变量
第二个代码
scanf 库函数 用于从键盘上接收数据
&取地址
\n换行
%d一个十进制的整数
4.4变量作用域和生命周期
4.5 常量
C语言中的常量分为以下几种:
字面常量
3 ;100 ;3.14; 'a' ;"abcdef"(字符串)都是字面常量(不能改的)
const修饰的常变量
常属性——不能改变的属性 。const int num=200
使用const修饰后不能被修改,具有常属性,const限制num不能被修改。
#define定义的标识符常量
定义符号(一般放在全局范围)
#define M 100
int main()
{
int arr[M] = { 0 };
printf("%d\n", M);
return 0;
}
枚举常量(一一列举)
5 字符串+转义字符+注释
5.1 字符串
”hello bit .\n"
这种由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符 串。 注:字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串 内容。
>声明和定义
写在前面 int a = 10 定义
如果定义放在后面,而前面又想使用,就需要声明(有这么一个变量)
%s 打印字符串
一直要打印到\0 才停止,如果没有结束标志则会出现随机值。
strlen 计算字符串长度
5.2 转义字符
ASCII 码
5.3 注释
6 选择语句
if 语句 选择
else
7 循环语句
for 循环
while 循环
do while 循环
8 函数
9 数组
1、数组的概念—数组中可以存放一组相同类型的元素
2、数组的创建和初始化
int arr1[10] = {1,2,3,4,5,6,7,8,9,10};
int arr2[10] = { 1,2,3,4,5};//不完全初始化,剩余的默认初始化为0
char ch[5] = { 'a
', 'b', 'c' };//不完全初始化,剩余默认初始化为\0
int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
3、数组下标从0开始
10 操作符
算数操作符
+ - * / %
移位操作符
>> <<
位操作符(和二进制有关,放到后面去讲)
& ^ |
赋值操作符
= += -= *= /= &= ^= |= >>= <<=
int a = 0;//初始化,创建变量的同时给一个值,这叫初始化
a = a + 5;
a += 5;
a = a * 10;
a *= 10;
单目操作符
int a = 100;
int b = (a++); //
后置++,先使用,后++
int b=a,a=a+1; (a=101,b=100)
int b = ++a;//
前置++,先++,后使用
a=a+1,b=a; (a=101,b=101)
int b = a--;
int b = a,a=a-1;
int b = --a;
a=a-1,b=a;
强制类型转换
int a = (int)3.14; 强制转换为整型,只取整数部分
关系操作符
一个等号 赋值,两个等号,判断相等
逻辑操作符
&& 逻辑与 &&两边同时为真才为真
| | 逻辑或 | |两边同时为假才为假
条件操作符
exp1?exp 2:exp3
可简化if else 语句
m=( a>b ? a : b )
如果语句1(a>b)成立,执行语句2(m=a),如果a>b为假,执行语句3(m=b)
int arr[10] = {1,2,3,4,5,6,7,8,9,0};
printf("%d\n", arr[4]); //[ ]下标引用操作符
()函数调用操作符
11 常见关键字
auto 局部变量 自动创建自动销毁
循环 break
分支 if switch case break
EOF 文件结束标志 end of file
while (scanf("%d", &a) != EOF)
scanf函数读取失败的时候返回EOF,如果读取正常,返回的是读取到的数据的个数
11 常见关键字
1、register——寄存器
建议编译器把变量放进寄存器
register int a = 10
2、typedef——类型重命名
(此处查询代码)
unsigned int (无符号)
3、static
1)修饰局部变量
0<10 进来,调用一次test函数,i++=1,继续调用,循环执行10次
a是局部变量,自动创建自动销毁,输出结果:10个1
如果变成static int a = 0,
输出结果:1-10,这是因为
static修饰的局部变量生命周期被延长了(作用域不变)
。
本质上:
static的修饰改变了局部变量的存储位置,因为存储位置的差异,使得执行效果不一样。
内存被划分为几个区域:堆区、栈区、静态区。
栈区堆放局部变量、函数参数等临时变量,堆区用来动态内存分配(malloc、calloc、realloc、free)
静态区用来存放静态变量和全局变量,放在静态区的数据创建后,直到程序结束才释放。
2)修饰全局变量
extern 声明外部符号(使用其他源文件中定义过的符合)
全局变量本身是具有外部链接属性的,但是如果全局变量被static修饰,这个外部链接属性就变成了内部链接属性,这个全局变量
只能在自己所在的源文件内部使用,使全局变量的作用域变小。
3)修饰函数
同上,使外部链接属性变成内部链接属性。
头文件一般包含:类型的定义、包含其他头文件、函数的声明,不会放函数定义
12 #define 定义常量和宏
几种max的定义方式
宏的名字:MAX,
宏的参数x , y ,
宏体(x>y?x : y)
一般来讲,宏用来处理非常简单的逻辑,复杂的用函数来处理
13 指针
13.1 内存
内存是计算机上的一种存储空间 ,程序运行的时候会载入内存,程序中如果有数据需要存储,也会申请内存空间。
问:如何有效的使用内存?
把内存空间划分为内存单元,并给它们编号,把内存单元的编号称为地址(指针)
以32位机器为例,2^32个字节的内存空间=4GB.
int a =1;向内存申请4个字节
&取地址操作符,先把地址先存到一个变量里 %p专门用来打印地址
11的二进制序列 1011, 8+0+2+1
存储地址需要指针变量,指针变量大小取决于地址大小
int num = 10; # //取出num的地址
//注:这里num的4个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址)
printf("%p\n", &num); //打印地址,%p是以地址的形式打印
是变量就要分配空间
14 结构体
char short C语言的内置类型
人、书之类的 复杂对象 很难描述,C语言提供自定义类型:结构体、枚举、联合体。
struct 结构体关键字
例如:定义一个学生类型
指针:类型名+变量+* ps(得到s的地址,指向s)