C语言复习小记
变量分为局部变量和全局变量,main()函数里的变量只能用于main()里,{}包围的叫代码块,代码块里的变量只能用于代码块里这个int c是一个全局变量,定义在全局局部变量只声明没赋值,值会随机。全局变量自动赋0声明一个常量,const可以声明一个常量后续无法修改这个常量但可以直接使用(只读)#define是宏定义,定义一个宏比如途中定义最大等级是一百,以后使用“max_level”时就可以使用
C语言基础

变量分为局部变量和全局变量,main()函数里的变量只能用于main()里,{}包围的叫代码块,代码块里的变量只能用于代码块里

这个int c是一个全局变量,定义在全局(在main函数外面)
局部变量只声明没赋值,值会随机。全局变量自动赋0
++++++
声明一个常量,const可以声明一个常量
后续无法修改这个常量但可以直接使用(只读)
#define是宏定义,定义一个宏
比如途中定义最大等级是一百,以后使用“max_level”时就可以使用%d,max_level

这个宏的作用是在整个源文件(或包含该头文件的所有源文件)中,将所有出现的 DEV_NAME 替换为 "key"。
数据类型
基本数据类型
int short long longlong
char
float double
派生数据类型
数组 指针 结构体 共用体 枚举 void
char 字符变量“ ‘A’ ”
%c:要输出的是一个字符
%d:整数类型 字符和整型是内存中不同的两个表达形式(ASCLL码)
%f:浮点类型
%s:字符串类型
指针变量格式化标识符%p
int用来存储一个整数 通常是四个字节大小

一个bit是0/1,三个bit可以表示8个数(2^3) 一个字节(byte)是8个bit 可以表示2^8=256 个
一个int是四个字节 可以存储2^32个不同的值 int的取值范围是-2^31~2^31 -1
-1是因为最前面的0/1表示正负

long 比int的字节数要长
float是四个字节大小 7位有效数字 double一般是八个 15-17个有效数字
void是没有值的意思,通常用来表示函数的返回值 不想返回任何值的时候可以用void

5:101
6:110 与或非是在这俩上面操作4=100 7=111 3=011
c=5(101) c<<1 = 10(1010) c>>1 = 2(10+
);
控制流程语句
if语句
if{ }elseif{ }else

三元运算符 condition?expr1:expr2

switch语句
switch的条件表达式只能是整型或字符型,语句后面+常量表示条件
break的意思是执行完跳出语句,不然会继续执行下一个代码

default的意思是当上面所有case条件都不成立时执行这个语句
循环语句
重复执行某段代码
while dowhile for

while可能不执行,dowhile至少执行一次


初始化,循环条件和更新都可以省略或者放到for之前/printf后
省略条件就是没有终止条件的无限循环(死循环)


添加break可以终止死循环
continue可以跳过当前循环进入下次
比如1-9排序跳出5直接打印4
goout语句会破坏代码结构一般不使用
指针
指针变量格式化标识符%p

int后的*是表示指针,printf里的是解引用目的是获取某个地址里的数据

**p是二级指针,p2指向p p指向a
对p2进行两次解引用(**p2)即可得到a的值
![]()
对指针进行加减的话实际上是对柜子编号的操作,所以int数据就会是p+4(int占四个字节,p是地址)
内存
栈内存 局部变量和函数的参数
堆内存 内存较大但是需要手动分配释放

malloc和free 分配和释放;指针需要赋值为空
指针的释放——NULL,防止野指针指向别的地方
数组


二维数组

指针和数组
数组名本身就是一个指针常量,存储的是数组的首地址 所以数组名可以直接赋值给一个指针变量


此处指针+1-1的操作是在元素上左移右移,所以地址是+-4

函数
封装了一组语句的代码块,可以提高代码的复用性和可维护性(可重复使用)
函数名前面加上一个返回值类型后面加上一对小括号里面是函数的参数列表然后再加上一对大括号
int add(...)
{
...
return ...
}

要有返回值,加了void表示没有返回值
如果函数有返回值,函数体一定要有return语句
void后面要有return或者不写
#include<string.h> 这是库的.h
#include"function.h" 这是自己写的.h
函数传参 传值 传地址
形参:形式参数,函数定义时括号中的参数
实参:实际参数,实际调用时传递给函数的参数
.h文件的编写
eg:
a,b是形参。x,y是实参
传值:实参的值拷贝给形参,形参的改变不会影响实参
传地址:
虽然 swap2 会修改原始变量的值,但它 不会返回任何值,只是通过指针修改了外部变量。
而swap是用来传地址的,所以swap那段并不会交换xy的值
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"function.h"
int add(int a, int b) // 定义了一个 add 函数,用于计算两个整数的和。
{
return a + b;
}
void hello() // 定义了一个 hello 函数,用于打印问候语
{
printf("Hello!\n");
}
void swap2(int *a, int *b) // 定义了一个 swap2 函数,通过指针来交换两个整数变量的值
{
int temp = *a;
*a = *b;
*b = temp;
printf("*a = %d, *b = %d\n", *a, *b);
}
int main() // 主函数区(程序执行入口)
{
int a = 10;
int b = 20;
printf("a+b = %d\n",add(a,b)); // 输出a,b的和
hello(); // 调用 add 函数计算 a 和 b 的和,并调用 hello 函数输出
int x = 10;
int y = 20;
//swap(x,y); // 调用 swap,但无效
printf("x = %d,y = %d\n",x,y);
swap2(&x, &y); // 正确传递地址 第二次调用函数
// 调用 swap2 函数,传入 x 和 y 的地址,从而交换它们的值,并打印交换后的结果
printf("x = %d, y = %d\n", x, y); // x = 20, y = 10
return 0;
}
函数这一块
函数指针:
void(*p)(int *,int *);
p = swap2; // p指向了swap函数
则p = swap2; 即p(&x,&y) = swap2(&x,&y);
函数名会在大多数情况下隐式转换为函数地址
递归函数定义了一个阶乘,后续可以调用
![]()
递归函数需要一个“出口”,不然会无限递归
static关键字
int a前面加上static可以在结束的时候保留
static修饰函数内部局部变量的时候这个变量是静态变量,生命周期和程序一样

结构体struct
C 语言的 struct 没有访问控制的概念,所有成员默认都是公共的,外部可以直接访问 struct 的所有成员
结构体可以包含很多个类型不同的成员

struct student
{
char name[20];
int age;
float score;
};
int main()
{
struct student stu1 = {"Tom",18,90.5};
return 0;
}
全局变量、静态变量自动初始化为0;
eg:struct student stu1写在main()函数外或者main()里写static struct student stu1,都是自动初始化为0
int main() {
struct student stu1;
strcpy(stu1.name, "Tom");
printf("name: %s, age: %d, score: %.1f\n", stu1.name, stu1.age, stu1.score);
Student stu2;
strcpy(stu2.name, "Jerry");
printf("name: %s, age: %d, score: %.1f\n", stu2.name, stu2.age, stu2.score);
return 0;
}
typedef 给已有的数据类型取一个新名字,使用这个新名字就不用一直写struct...了
typedef struct student Student;
共用体
跟结构体差不多,不过共用体的所有成员共享同一块内存空间(地址相同)
比如
union studeng stu1;
stu1 age = 100;
printf("name:%s,age:%d\n");
此时name没有初始化,但是会输出d
枚举

enum+类型 {
定义
}
枚举在定义的时候大括号里的值都会被赋予一个整数值,默认从0开始
TUE就是2,输出day = 2;
或者直接在大括号里指定MON = 3;此时输出TUE的day = 4(自动往后继续排)
头文件
定义一个.h文件

三个指令
更多推荐

所有评论(0)