目录:
1、函数
2、数组
3、操作符
4、常见关键字
5、define 定义常量和宏
6、指针
7、结构体
一、函数
函数定义:
二、数组
一组相同类型元素的集合
int arr [5]={1,2,3,4,5};//int 数组类型,即数组内存放值的类型;arr数组名
每个元素都有一个下标,下标从0开始。
初始化:在定义时赋值
例: int arr[10];不进行初始化,是随机的内容
int arr[10]={1,2,3,4,5,6,7,8,9,10};//完全初始化
int arr [10]={1,2,3,4}不完全初始化,只初始化前3个,剩余的初始化为0;
int arr[3]={0};表示用0进行初始化{0,0,0}
int arr[ ]={1,2,3};元素个数可以省略(自动认为是3)
int arr[ 3];
v={1,2,3};不能通过赋值语句进行初始化
三、操作符
1、算术操作符:
+ — * / %
加 减 乘 除 取余
1、 加(+),减(—),乘(*),除(/)和我们平常的用法一样,都适用于浮点数和整形数;
2、除(/)(整数)/(整数)3/2结果为整数;
3、(整数)/(浮点数)3/2.0结果为小数;只要操作数为浮点数,结果就是小数(浮点数);
4、取余(%):操作符的操作数必须为整数,结果为整数之后的余数。
2、赋值操作符:
= += -= *= /=
也称“复合运算符”。
例:a+=2等同于a=a+2;这个式子是先计算等号右边的,再把值赋给左边
3、单目操作符:(只有一个操作数)
! | 逻辑反操作符 |
- | 负值 |
+ | 正值 |
& | 取地址 |
sizeof | 操作数的类型长度(以字节为单位) |
-- | 前置、后置-- |
++ | 前置、后置++ |
* | 间接访问操作符(解引用操作符) |
(类型) | 强制类型转换 |
前置:例如 ++a先自增+1,后赋值;
后置 :a++先赋值,后自增+1;
sizeof用法:
#include<stdio.h>
int main()
{
int arr[10]={0};
printf("%d\n",sizeof(arr)); 计算数组总大小(占字节) 40
printf("%d\n",sizeof(arr[0])); 计算数组第一位大小(占字节) 4
printf("%d\n",sizeof(arr)/(arr[0])); 计算数组元素个数 40/4
printf 0;
}
4、关系操作符(双目操作符)
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
!= | 判断是否“不相等” |
== | 判断是否“相等” |
5、逻辑运算符(双目操作数)
&& | 逻辑与、符号两边表达式都为真才真 |
|| | 逻辑或、符号两边表达式有一边为真就为真 |
6、条件操作符: (三目操作符)
exp1 ? exp2 :exp3 exp1为真,则执行exp2,为假则执行exp3
举例: a>b ? a : b
真: -
假: -
7、逗号表达式:
exp1 , exp2 , exp3 , .....expN 从左往右逐个计算表达式,整个逗号表达式的值为最后一个表达式(expN)的值 ,前面的计算会影响后面的结果。
操作符在这里先了解一下,后面还会有详细介绍。
四、常见关键字
列举:
auto break case char const continue default do doubt else enum exterm
float for goto if int long register return short signed sizeof static
struct switch typedef union unsigned void volatile while
五、#define定义常量和宏
define是一个预处理指令,可以定义符号和宏。
1、define定义标识符常量
//define定义标识符常量
#include<stdio.h>
#define M 1000 //define定义了一个符号(常量)M值为1000
int main()
{
int arr[M];//可以用define定义的标识符常量做数组元素个数;
printf("%d\n", M);//define 定义的符号的值可以直接使用
return 0;
}
2、define定义宏
//宏
//define定义宏
//宏和函数很像,都有参数。
#include<stdio.h>
#define ADD(x,y)((x)+(y))//宏的定义
int main()
{
int a = 10;
int b = 20;
int sum = ADD(a, b);
printf("sum=%d\n", sum);
return 0;
}
//函数
#include<stdio.h>
int Add(int x,int y)
{
return x + y;
}
int main()
{
int a = 10;
int b = 20;
int sum = Add(a,b);
printf("sum=%d\n",sum);
return 0;
}
宏和函数的区别:
函数: 函数的参数有具体的类型,函数将函数体放在{}中
宏: 宏的参数没有具体类型, 宏的内容就跟在参数后面。
六、指针
内存单元的编号,也就是指针,也就是地址。
这里一个方框是一个内存单元,一个内存单元占一个字节。
解引用(*):引用其实就是引用该变量的地址,“解”就是把该地址对应的东西解开。解引用是返回内存地址中保存的值。
举例:
#include<stdio.h>
int main()
{
int a = 10;
int* pa = &a;//& 取地址操作符
*pa = 20;//* 解引用操作;修改原地址的中变量
printf("%d\n", a);
printf("%p\n",&a);//取出a所占4个字节中第一个字节的地址
return 0;
}
七、结构体
结构体使C语言有描述复杂类型的能力。
比如描述学生,学生包含:名字+年龄+性别+学号这几项信息。
这里只能使用结构体来描述了。
例如:
#include<stdio.h>
struct Stu// struct是一个结构体关键字
{
char name[20];//名字
int age; //年龄
char sex[5]; //性别
char id[15]; //学号
};
void print(struct Stu *ps)
{
printf("%s %d %s %s\n",(*ps).name,(*ps).age,(*ps).sex,(*ps).id);
printf("%s %d %s %s\n",ps->name,ps->age,ps->sex,ps->id); //结构体指针->结构体成员
//指针两种不同的输出方式
}
int main()
{
struct Stu s={"zhangsan",20,"nan","2022010578"};//s是结构体变量,它包括(名字,年龄,性别,学号)
printf("%s %d %s %s\n",s.name,s.age,s.sex,s.id);//结构体变量.结构体成员
print(&s);//print是自定义函数不是库函数
return 0;
}//用两种输出方式 一种是直接输出 一种是指针方式
注释:
1、什么时候用ps->和s.
如果你得到的是结构体指针变量用->,如果得到的是结构体变量用s.
2、如上面代码s.name
左边是结构体变量.右边是结构体成员
ps->name
左边是结构体指针->右边是结构体成员
3、如上述代码struct Stu 只是将四个数据集中起来,形成一个类型名,并不定义对象(变量)的实体,不占内存空间。他只是形成一个格式,具体内容需要变量s定义。
结构体初始化: