C语言速通

一些你该知道的东西

基本结构

 #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的条件就继续去循环

image

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


image

举个例子体会一下

一共打印几次hehe呢,没错9次

指针

所谓指针呢,如果把一个变量比喻成一个房子,地址就是这个房子的门牌号(专业描述是,这个变量在内存中储存的位置),指针就相当于门牌用来储存门牌号(储存指针的变量叫做指针)。

 int* p = &a;

int表示储存变量的地址的类型,int*表示这是一个指针变量,p表示指针的名字,&a表示取a 的地址

NULL表示空指针,数组arr的名字表示的是数组首元素的地址。

image
 *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

重要考点

传值调用和传址调用

image

举一个例子,上面的自定义函数很明显是一个简单的数据交换。

但是你会发现好像不能实现这个功能,这个是因为,你在调用这个函数的时候,相当于你复制了一份同样的数据给了这个函数,函数只能改变你的复制品,怎么能改变的本身的值呢

为了解决这个问题,我们就需要传址调用,把地址传入函数,地址是不会复制的,第一个地址对应一个数据,一个萝卜一个坑,这样函数就能根据你的地址,找到你的家,然后改变这个数据

image

递归

说白了就是一种函数套函数

要求:将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(归)

让我们再看个真题

image-20251217132335738
bc53eb59fdb844b1a0fd0cffc621a6f2_720

P108

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

评论

  1. springbot
    Windows Edge
    1 月前
    2025-12-17 15:28:13

    沙发

发送评论 编辑评论


				
上一篇
下一篇