一些你该知道的东西
基本结构
#include <stdio.h>//头文件,这个头文件基本上必加
int main()//主函数
{
//这是内容
return 0;
}
变量
注意变量的作用域;(可以理解为,作用范围是包含定义最小的大括号范围)如果跑出这个范围,函数就没定义了。
如果变量前面有static修饰那么这个变量,这个变量不会被重复初始化,就算跑出去了,仍然保留这个值
int a = 0;
int a;
//这两个是等效的都是定义了一个变量a,且初始化值为0
常见的字符类型
int//整数-----%d(来打印或输出)
float//小数-----%f(来打印或输出)
double//更精确小数-----%lf(来打印或输出)
char//字符-----%c(来打印或输出)
数组或字符串
一维数组
int a[10] = {0};
int a[10];
//定义一个长度为10的新数组
二维数组
int a[10][10] = {0};
int a[10][10];
//定义一个10*10的二维数组前面[]是行后面[]是列
字符串
char a [10] = {}//一个长度为10的字符串
运算符/操作符
/表示取整,9/3 = 3,9/4 = 2
%表示取余。9%3 = 0;9%4 = 1;
&表示取地址(地址就相当于类比于门牌号)
||表示或
&&表示且
sizeof()
int arr[10] = {1,2,3,4,5}
int a = sizeof(arr)//求数组里面内容所占的字节数,一个整形为四个字节
int b = sizeof(arr[0])//求数字下标号为0的内容的大小。
int c = sizeof(arr)/sizeof(arr[0])//表示数组内内容的长度
输入输出
常见的printf 和scanf
//格式
scanf("%d",&a);//输入整形变量a,不要漏了&
printf("%d",a);//输出整形变量a
字符的输入输出
char c;
getchar(c);//输入字符
putchar(c);//输出字符当然也可以用printf(但是注意,print发输出字符串的时候,导\0就停止输出了)
//例如
char arr[10] = {abc\0cd}
printf("%s",arr);//这时候输出结果是abc
分支循环
switch 分支
switch (a)//括号里面必须是int类型的变量
{
case 1://这里是冒号
printf();
case 2:
printf();
return 0;
}
1.case表示的是int的值,如果int a = 1那么进入case1下面的语句
2.case 决定了入口,之决定从哪开始运行如果不加 break 会依次向下运行所有选项只有 break 才会跳出 switch 语句
也就是说上面的两个printf都会运行
switch (a)//括号里面必须是int类型的变量
{
case 1://这里是冒号
printf();
break;
case 2:
printf();
default:
printf();
return 0;
}
这样如果a = 1;就只会打印第一个printf
如果a不等于1或2则会进入default(如果超出条件值用 default)
if
if(条件)//这里注意,0表示假,非0表示真,如果是!表示取反,!1表示假,!0表示真
{
满足条件执行的内容,如果没有大括号只执行if下面的第一句话,右大括号执行大括号里面的内容。
}
while
while(这里写条件)
{
这里写内容
}
while(i<=20)
{
i+=a;//这里表示为i = i+a;(a是个变量这里省去定义了)
if(i == 1)//这里注意一个点,一个等号表示赋值,两个等号表示判断
break;
if(i == 2)
continue;
i++;//表示i+1
}
printf();
i == 1的时候break表示的是跳出循环,也就是i == 1的时候,循环结束了,执行下面的printf
i == 2的时候continue表示跳过本次循环中下面的内容,直接进行下一次循环,也就是说i==2的时候不进行i++而再次从头开始进行循环。
do while
do
{
循环的内容
}while(条件);
满足while的条件就继续去循环

for
//非常好用而且常用于你自己写代码
for(int i = 0;i<10;i++)
{
循环内容
}
(一个变量;变量满足的条件;变量在一次循环后做出的改变),如果有的地方空着表示恒成立,比如说(;;)表示循环一直进行。
插一个点啊
++a表示a先++然后进行使用,例如++a>10,表示a先+1然后判断>10是否成立,比如说a初始值为8,那么a先+1,然后判断>10成立
a++表示先使用后++,例如a++>10,表示a先判断>10是否成立在+1

举个例子体会一下
一共打印几次hehe呢,没错9次
指针
所谓指针呢,如果把一个变量比喻成一个房子,地址就是这个房子的门牌号(专业描述是,这个变量在内存中储存的位置),指针就相当于门牌用来储存门牌号(储存指针的变量叫做指针)。
int* p = &a;
int表示储存变量的地址的类型,int*表示这是一个指针变量,p表示指针的名字,&a表示取a 的地址
NULL表示空指针,数组arr的名字表示的是数组首元素的地址。

*p = 0;
*表示解引用,因为p是一个指针变量,就是门牌,** 能够分析出这个门牌的内容,,这个语句表示把整形0放到p储存的地址里面
int a = 0;
int*p = &a;
*p = 1;
这里p储存的是a的地址,也就是把1放到a里面,a的值就是1
函数
库函数
常见的:
strlen
头文件#include <string.h>
char a[5] = {abcd};
int c = strlen(a);
sqrt
头文件<math.h>
表示开平方
定义函数最好放在main函数前面定义,这样少写一个函数声明。
int(返回值类型,没返回值就是void) 名字(输入的变量)
{
函数的内容
}
//例子
void yuanshen(int i)
{
if(i == 1)
printf("原神启动");
else
printf("启动不了了");
}
如果用void则表示不需要返回,
返回值不能一次性返回两个数,例如return 3,4只会返回4
重要考点
传值调用和传址调用

举一个例子,上面的自定义函数很明显是一个简单的数据交换。
但是你会发现好像不能实现这个功能,这个是因为,你在调用这个函数的时候,相当于你复制了一份同样的数据给了这个函数,函数只能改变你的复制品,怎么能改变的本身的值呢
为了解决这个问题,我们就需要传址调用,把地址传入函数,地址是不会复制的,第一个地址对应一个数据,一个萝卜一个坑,这样函数就能根据你的地址,找到你的家,然后改变这个数据

递归
说白了就是一种函数套函数
要求:将1234打印为1 2 3 4
void Print(unsigned int n)
{
if (n > 9)
{
Print(n / 10);
}
printf("%d ", n%10);
}
int main()
{
unsigned num = 0;
scanf("%u", &num);
Print(num);
return 0;
}
输入1234后,在函数中先不断的调取print函数,当调取完四遍后开始从最后一次调用开始打印(递),最后一次调用printf的内容是1然后打印出1234(归)
让我们再看个真题


P108
- 首先给srand()提供一个种子,它是一个unsigned int类型,其取值范围从0~65535;
- 然后调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到32767之间)

沙发