目录
数组
C语言中数组是一组同类元素的集合。
数组的定义
int arr[10]={1,2,3,4,5,6,7,8,9,10};
上面定义了一个最多放10个元素的整型数组。
数组的下标
数组的每个元素都有下标,从0开始到n-1结束(n是数组元素的个数)。
数组是通过下标来使用的。
数组的使用
int main()
{
int arr[10]={1,2,3,4,5,6,7,8,9,10};
int i=0;
for(i=0;i<10;i++)
{
printf("%d ",arr[i]);
}
return 0;
}
运算符
运算符及说明
单目运算符
优先级 | 运算符 | 名称或含义 | 使用形式 | 结合方向 | 说明 |
1 | [] | 数组下标 | 数组名[常量表达式] | 左到右 | 访问数组元素,操作数 数组名[变量] |
() | 圆括号 | (表达式)/函数名(形参表) | 1、表达式优先级 2、函数名 | ||
. | 成员选择(对象) | 对象.成员名 | 结构体使用 | ||
-> | 成员选择(指针) | 对象指针->成员名 | 结构体指针使用 | ||
++ | 后置自增运算符 | ++变量名 | 单目运算符,先使用后自增 | ||
-- | 后置自减运算符 | --变量名 | 单目运算符,先使用后自减 | ||
2 | - | 负号运算符 | -表达式 | 右到左 | 单目运算符,改变正负 |
(类型) | 强制类型转换 | (数据类型)表达式 | |||
++ | 前置自增运算符 | 变量名++ | 单目运算符,先自增后使用 | ||
-- | 前置自减运算符 | 变量名-- | 单目运算符,先自减后使用 | ||
* | 取值运算符 | *指针变量 | 单目运算符,对指针变量进行解引用,找到指针变量所指向的对象 | ||
& | 取地址运算符 | &变量名 | 单目运算符,取得地址 | ||
! | 逻辑非运算符 | !表达式 | 单目运算符,对表达式的值取反,0为假,非0为真(负数也为真) | ||
~ | 按位取反运算符 | ~表达式 | 单目运算符,对数据的二进制位进行取反 | ||
sizeof | 长度运算符 | sizeof(表达式) | 单目运算符,计算对象类型的长度 | ||
3 | / | 除 | 表达式/表达式 | 左到右 | 双目运算符, 1,整数除法,表达式的结果都是整数 2、浮点数除法,任一表达式是浮点数 |
* | 乘 | 表达式*表达式 | 双目运算符 | ||
% | 余数(取模) | 整型表达式/整型表达式 | 双目运算符,求任一整数的余数,表达式必须为整数 | ||
4 | + | 加 | 表达式+表达式 | 左到右 | 双目运算符 |
- | 减 | 表达式-表达式 | 双目运算符 | ||
5 | << | 左移 | 变量<<表达式 | 左到右 | 双目运算符 |
>> | 右移 | 变量>>表达式 | 双目运算符 | ||
6 | > | 大于 | 表达式>表达式 | 左到右 | 双目运算符 |
>= | 大于等于 | 表达式>=表达式 | 双目运算符 | ||
< | 小于 | 表达式<表达式 | 双目运算符 | ||
<= | 小于等于 | 表达式<=表达式 | 双目运算符 | ||
7 | == | 等于 | 表达式==表达式 | 左到右 | 双目运算符 |
!= | 不等于 | 表达式!= 表达式 | 双目运算符 | ||
8 | & | 按位与 | 表达式&表达式 | 左到右 | 双目运算符 |
9 | ^ | 按位异或 | 表达式^表达式 | 左到右 | 双目运算符 |
10 | | | 按位或 | 表达式|表达式 | 左到右 | 双目运算符 |
11 | && | 逻辑与 | 表达式&&表达式 | 左到右 | 双目运算符 |
12 | || | 逻辑或 | 表达式||表达式 | 左到右 | 双目运算符 |
13 | ?: | 条件运算符 | 表达式1? 表达式2: 表达式3 | 右到左 | 三目运算符 |
14 | = | 赋值运算符 | 变量=表达式 | 右到左 | |
/= | 除后赋值 | 变量/=表达式 | |||
*= | 乘后赋值 | 变量*=表达式 | |||
%= | 取模后赋值 | 变量%=表达式 | |||
+= | 加后赋值 | 变量+=表达式 | |||
-= | 减后赋值 | 变量-=表达式 | |||
<<= | 左移后赋值 | 变量<<=表达式 | |||
>>= | 右移后赋值 | 变量>>=表达式 | |||
&= | 按位与后赋值 | 变量&=表达式 | |||
^= | 按位异或后赋值 | 变量^=表达式 | |||
|= | 按位或后赋值 | 变量|=表达式 | |||
15 | , | 逗号运算符 | 表达式,表达式,… | 左到右 | 从左向右顺序运算,表达式的结果为最后一个计算的结果 |
关键字
关键字及说明
数据类型关键字(12个) | |||
1 | char | 声明字符类型变量,数组,函数等 | |
2 | short | 声明短整型类型变量,数组,函数等 | |
3 | int | 声明整型类型变量,数组,函数等 | |
4 | long | 声明长整型类型变量,数组,函数等 | |
5 | float | 声明单精度浮点类型变量,数组,函数等 | |
6 | double | 声明双精度浮点类型变量,数组,函数等 | |
7 | struct | 声明结构体类型变量,数组,函数等 | |
8 | enum | 声明枚举类型变量 | |
9 | union | 声明联合体类型变量,数组等 | |
10 | void | 声明函数无返回值或无参数,声明无类型指针(基本上就这三个作用) | |
11 | signed | 有符号型数据 | |
12 | unsigned | 无符号型数据 | |
控制语句关键字(12个) | |||
13 | for | 创建for语句循环 | 循环语句 |
14 | do | 创建do while语句循环 | |
15 | while | 创建while或者do while语句循环 | |
16 | break | 跳出当前循环或跳出switch语句 | |
17 | continue | 结束当前循环,开始下一轮循环 | |
18 | if | 创建if条件语句 | 条件语句 |
19 | else | 控制if语句分支 | |
20 | goto | 直接进行跳转(不受限制) | |
21 | switch | 创建switch语句 | |
22 | case | 控制switch语句分支 | |
23 | default | 控制switch语句的其他分支 | |
24 | return | 结束函数运行并返回函数的计算结果 | 返回语句 |
存储类型关键字(4个) | |||
25 | auto | 自动,局部变量自动创建自动销毁 | |
26 | extern | 声明引入其他文件的变量,数组,函数等 | |
27 | register | 声明寄存器,但本质只是建议将变量放入寄存器 | |
28 | static | 声明静态变量 | |
其它关键字(4个) | |||
29 | const | 声明只读变量 | |
30 | sizeof | 计算数据类型的长度 | |
31 | typedef | 类型重命名 | |
32 | volatile | 说明变量在程序执行中可被隐含地改变c |
关键字typedef
typedef unsigned int uint;
int main()
{
uint num=32;
return 0;
}
关键字static
修饰局部变量
被修饰的局部变量被称为静态局部变量
static int num;
修饰后局部变量的生命周期发生改变,由原来的进入作用域开始,出作用域结束变为出作用域不结束,知道整个工程结束才结束,类似于全局变量
改变的原因是static修饰后的变量并不是放在栈区中,而是放入了静态区。
static修饰的变量,通过反汇编观察,可以看到编译期间才创建,执行期间不创建。
修饰全局变量
全局变量拥有外部链接的属性,在一个源文件中创建的变量,可以在另一个源文件中声明和使用。
static修饰后,全局变量不再具有外部链接属性,也就是不能跨文件引用,相当于将全局变量的作用域变小了。
修饰函数
函数拥有外部链接的属性,在一个源文件中创建的函数,可以在另一个源文件中声明和使用。
static修饰后,函数不再具有外部链接属性,也就是不能跨文件引用,相当于将函数的作用域变小了。
对于全局变量和函数,static改变了他们的链接属性
关键字register
register是寄存器关键字,作用是建议将变量放入寄存器中。
上图是数据的读取过程,注意寄存器是集成在CPU上
#define定义常量和宏
#define的作用是给实际内容定义标识符,相当于起了个别名
#define MAX 100
#define ADD(x,y) ((x)+(y))
定义后编程时可以直接使用标识符,程序编译阶段会替换成实际内容
指针
内存
内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中运行的。
为了有效的使用内存,把内存划分成了一个个小的内存单元,每个内存单元的大小是1个字节。
为了能够有效的访问到内存的每个单元,就给内存地址编了号,这些编号被称为该内存单元的地址。
实际中内存有32根地址线和64根地址线,32根地址线对应32位电脑,一共有2^32个地址,64根地址线对应64位电脑,一共有2^64个地址。
变量是创建在内存中的,所以每个变量都有一个地址,该地址是变量所占内存单元的首地址。
指针的定义
指针就是地址。
指针变量的定义
指针变量是存放指针的变量。
int *p=&a;
char *pc=&c;
int * p中,p是指指针变量的名称,*是说明p是指针变量,int说明p指向的对象是int类型 。
全局变量在编译时创建,局部变量在运行时创建。
指针的意义,通过地址找到指针变量所指向的对象,*p就是p所指向的对象。
指针变量的大小
指针变量的大小以地址的大小为准
32位系统中,地址的长度是32位,所以是4个字节。
64位系统中,地址的长度是64位,所以是8个字节。
结构体
结构体是把单一的类型组合在一起的自定义类型
结构体定义
struct stu
{
char name[30];
int age;
}
结构体的使用
结构体使用需要"."和"->"符号
"."用来连接结构体变量名和成员名。
"->"用来连接结构体指针名和成员名。
作用都是找到结构体的成员。