408 计算机考研-001-C语言-C语言基础-考研必学
本文目录
- 408 计算机考研-001-C语言-C语言基础-考研必学
- 考研C语言应掌握的内容
- 考研真题
- 2022 年考研真题第 1 题
- 2022 年考研真题第 41 题
- 2021 年考研真题第 42 题
- 一、打印:Hello, World
- 二、数据类型
- 1. 基本数据类型
- 三、运算符
- 四、流程控制
- 五、函数
- 六、数组和指针
- 1. 数组
- 2. 指针
- 3. 动态内存分配
- 七、结构体和联合体
- 1.结构体
- 八、常用函数
- 总结
- 参考资料
考研C语言应掌握的内容
计算机408考纲内容:
能够运用数据结构基本原理和方法进行问题的分析与求解,具备采用 C 或 C++语言设计与实现算法的能力
大家可以先看下下面的几道真题,如果下面的题目你都能看到,那么你对于C语音在考研中需要的的基础知识应该也差不多了。如果你看不懂的话那么可以接着往下面看,所有的知识点都在代码里面。
从下面几道真题题目中我们可以知道需要掌握C语言的如下知识:
- 数据类型:了解C语言的基本数据类型(整型、浮点型、字符型等),以及如何声明和使用变量。
- 运算符:熟悉C语言的算术运算符、关系运算符、逻辑运算符等,以及它们的优先级和结合性。
- 控制流程:理解C语言的条件语句(if-else语句、switch语句)和循环语句(for循环、while循环),以及如何使用它们控制程序的执行流程。
- 函数:掌握如何定义、调用和传递参数给函数,以及如何使用函数来组织代码和实现模块化。
- 数组和指针:了解如何声明、初始化和操作数组,以及如何使用指针来访问数组元素和动态分配内存。
- 结构体和联合体:了解如何定义和使用结构体和联合体,以及它们如何用于组织和管理复杂的数据。
- C语言中的常用函数:熟悉如常见的字符串处理函数,如strlen、strcmp、strcpy等。
考研真题
2022 年考研真题第 1 题
2022 年考研真题第 41 题
2021 年考研真题第 42 题
// 42.已知某排序算法如下
void cmpCountSort(int a[], int b[], int n)
{int i, j, *count;// C++语言:count = new int[n];count = (int*)malloc(sizeof(int) * n);for(i = 0; i < n; i++) count[i] = 0;for(i = 0; i < n - 1; i++) for(j = i+1; j<n; j++)if(a[i] < a[j]) count[j]++;else count[j]++;for(i = 0; i < n; i++) b[count[i]] = a[i];// C++语言:delete count;free(count);
}
一、打印:Hello, World
首先先来看看最经典的C的Hello,World程序吧。
/*** include是包含的意思,这句话的意思就是把 stdio.h 的这个文件包含进来* 专业解释:#include 这行代码是一条C预处理器指令* #include <stdio.h>:这句话代码就是把C语音中的 标准输入输出(stdio.h)库 引入进来* stdio.h: 这个文件里面包含了标准一些标准输入输出相关的函数, 如下面用到的 printf() 这个输出函数。还有如scanf() 输出函数* 引入库的标准格式: #include <函数库的名称>* 这属于C语言语法要求的格式,不用纠结为何这样写,记下来就好了*/
#include <stdio.h>/*** 这行表示函数名为main的函数* int: 表示函数值的反类型* main: 表示函数的名称,也可以叫 其他的名称, 如 abc() 等* 但是main这个名称有些特殊,它在C语音中表示的是开始的函数。* 意思是这个程序编译好后,如果要执行的话就会去找文件中找到名字叫main的函数。就像游戏中的开始按钮一样,如果游戏没有开始按钮就玩不了了。*/
int main()
// 这个左花括号 { 的意思表示函数定义的开始,代表着这个里面的东西属于一个整体
// 程序中的注释的表示方法: 1. 行注释 // <注释的内容> 2. 块注释 /* <注释的内容> */
{/*** 这行的意思是调用标准输入输出库(stdio.h)中的printf()函数,把 双引号中的 Hello, Wordl 输出到控制台中*/printf("Hello, World");/*** main函数可以给使用者返回一个数。目前,可暂时把该行看作是结束main()函数的要求。*/return 0;
// 这个右花括号 } 的意思表示的函数定义的结束
}
二、数据类型
1. 基本数据类型
/*** C语言数据类型*/
#include <stdio.h>
#include <limits.h>int main() {/*** char : 字符数据类型, 对应的值需要使用单引号扩起来。* 取值范围:-128 到 127 (对应于ASCII码)* ASCII码中 '0' = 48; 'A' = 65; 'a' = 97;*/char singleSymbol = 'A';printf("打印char据类型中的字符:%c \n", singleSymbol);printf("打印char据类型中的字符对应的ASCII码:%d \n", singleSymbol);/*** CHAR_MAX : 是从 <limits.h> 这个库中引入进来的。* 表示CHAR的最大取值范围,其中还有CHAR_MIN(char类型最小值), INT_MAX(int类型最大值)等*/printf("打印char字符最大值 %d \n", CHAR_MAX);/*** unsigned char : 无符号字符数据类型* 数据取值范围:0 到 255;* unsigned 也可以加到其他数类型的前面,待表对应的无符号数据类型* 如;unsigned int 、 unsigned long*/unsigned char unsignedSingleSymbol = 'A';/*** 整型数据类型* 一般都用的int类型就够了*/short shortIntegral = 10; // 短整型int integral = 10000; // 整型long longIntegral = 10000000L; // 长整型/*** 浮点数据类型,可以表示小数。常用double类型*/float floatNum = 1.1; // 单精度浮点型double pi = 3.1415962; // 双精度浮点型return 0;
}
三、运算符
/*** C语音中的运算符*/
#include <stdio.h>int main() {/*** 赋值运算符: =* 把等号右边的值赋值给左边*/int a = 10; // 把10赋值给变量aint b = 20;int c = 4;int d;/*** 算数运算符* 加、减、乘、除、取模、自增、自减* +、 -、 *、 \、 %、 ++、 --*/d = a + b; // 加法运算符 = 30printf("a + b = %d\n", d);d = a - b; // 减法运算符 = -10printf("a - b = %d\n", d);d = a * c; // 乘法运算符 = 40printf("a * b = %d\n", d);// 整数除法和浮点数除法不同。浮点数除法的结果是浮点数,而整数除法的结果是整数。整数是没有小数部分的数。d = a / c; // 除法运算符 = 2 ,printf("a * b = %d\n", d);d = a % c; // 取模运算符 = 2;printf("a * b = %d\n", d);c++; // 自增运算符 = 5printf("a * b = %d\n", c);c--; // 自减运算符 = 4printf("a * b = %d\n", c);/*** 关系运算符: 主要用来作为条件判断使用。* == (等于)、!= (不等于)、> (大于)、>= (大于等于)、< (小于)、<= (小于等于)*/if ( a < b) { // 判断 a 和 b 的大小printf("a 小于 b \n"); // 此句将会打印} else {printf("a 不小于 b \n");}/*** 逻辑运算符* && (逻辑与)、 || (逻辑或)、! (逻辑非)*/if ( a && b) {printf("a && b 条件为真 \n");}}
四、流程控制
/*** 流程控制*/
#include <stdio.h>int main () {/*** 判断语句*/int age = 18; // 年龄// if语句if (age >= 18) { // 判断年龄是否大于等于18岁printf("已满18岁,可以上网 \n");}// if else 格式age = 17;if (age >= 18) { // 判断年龄是否大于等于18岁printf("已满18岁,可以上网 \n");} else {printf("未满18岁,不可以上网 \n");}/*** 也可以简写为下面这样,意思同上* 注意:如果没有花括号的话只能跟携带一条语句*/if (age >= 18)printf("已满18岁,可以上网 \n");elseprintf("未满18岁,不可以上网 \n");// 多重选择 switch 语句char score = 'A'; // 成绩switch (score) {case 'A': // 如果成绩为A这进入到里面,并打印其中的语句printf("您的考试成绩为A \n");// 结束语句break;case 'B':printf("您的考试成绩为B \n");// 结束语句break;// 如果上面都没有匹配的,则执行到这里default:printf("您的成绩为C");}/*** 循环语句*/// while 循环int count = 1; // 计数器while (count <= 10) { // 打印 1 - 10printf("%4d", count);count++; // 计算器自增}printf("\n");// for 循环for (int i = 1; i <= 10; ++i) {printf("%4d", i);}printf("\n");
}
五、函数
/**
* C语言函数
* 函数(function)是完成特定任务的独立程序代码单元。
*/
#include <stdio.h>/* 函数声明 */
int max(int num1, int num2);int main() {/* 局部变量定义 */int a = 100;int b = 200;int result;/* 调用函数来获取最大值 */result = max(a, b);printf( "最大值是 : %d\n", result );return 0;
}/* 函数返回两个数中较大的那个数 */
int max(int num1, int num2) {/* 局部变量声明 */int result;if (num1 > num2)result = num1;elseresult = num2;return result;
}
六、数组和指针
1. 数组
/*** C语言数组*/
#include <stdio.h>int main() {/*** 声明数组*/int candy[10]; // 糖果数组double scores[52]; // 成绩数组/*** 数组的初始化*/int candyA[3] = {1, 2, 3};candy[0] = 1;/*** 访问数组*/printf("candy数组中的第一个值:%d", candyA[0]);return 0;
}
2. 指针
- C语言中的指针是一种特殊的数据类型,它用来存储变量的地址。指针变量表示的是一个内存地址,可以用来访问和修改该地址处的数据。
- 指针的声明形式为:数据类型 * 指针变量名;例如:int * p; 表示声明了一个指向整型数据的指针变量p。
- 使用指针变量时,可以通过解引用操作符*来访问该指针所指向的内存地址处的数据。例如:*p 表示访问指针p所指向的整型数据。
- 指针的主要作用是在函数间传递参数和动态分配内存。通过传递指针参数,可以在函数中修改实际参数的值。通过动态分配内存,可以在程序运行时动态申请和释放内存空间,实现灵活的内存管理。
- 使用指针时需要注意一些细节问题,如指针的初始化、指针的比较、指针的运算等。同时,在使用指针时还要注意避免空指针和野指针的出现,以免引起程序崩溃或数据错误的问题。
/*** C语言指针*/
#include <stdio.h>int main() {/** 指针的声明 */int * ptr; // 声明一个指向整型数据的指针char * str; // 声明一个指向字符型数据的指针/** 指针的赋值 */int num = 10;ptr = # // 将指针ptr指向变量num的地址/** 通过指针访问和修改数据 */printf("%d\n", *ptr); // 打印出变量num的值*ptr = 20; // 修改变量num的值printf("%d\n", num); // 打印出修改后的变量num的值/** 指针的运算 */int arr[5] = {1, 2, 3, 4, 5};int * arrPtr = arr; // 指针指向数组arr的第一个元素printf("%d\n", *arrPtr); // 打印第一个元素的值arrPtr++; // 指针右移一个元素printf("%d\n", *arrPtr); // 打印第二个元素的值return 0;
}
3. 动态内存分配
- C语言通过使用指针来管理内存,手动分配和释放内存。
- C语言中有两种主要的内存分配方式:静态分配和动态分配。
- 静态分配是在程序编译时进行的,在程序运行时分配固定大小的内存。静态分配的内存是通过声明变量和数组来完成的。例如,当你声明一个整型变量时,编译器会为它分配必要的内存。
- 动态分配是在程序运行时进行的,在程序运行时根据需要分配内存。动态分配的内存是通过C标准库函数malloc()和calloc()来完成的。
- 内存分配函相关数
- malloc():动态分配指定大小的内存块,并返回一个指向分配内存的指针。如果分配失败,则返回NULL。
- calloc():动态分配指定数量和大小的内存块,并返回一个指向分配内存的指针。calloc()函数在分配内存块之前会将其初始化为0。如果分配失败,则返回NULL。
- realloc():重新分配之前分配的内存大小,可以调整内存的大小。如果分配失败,则返回NULL。
- free(): 将先前分配的内存块返回给系统。
/*** C语言动态内存分配*/
#include <stdio.h>
#include <malloc.h>int main() {/*** 分配一个包含10个整数的数组,可以使用以下代码* 在这个例子中,`malloc`函数分配了`sizeof(int) * 10`字节的内存空间,并将指针赋值给了`arr`变量。* 注意,我们在类型转换前面加上了`(int*)`,这是因为`malloc`的返回类型是`void*`,需要将其转换为我们所需的指针类型。* 在分配完内存后,可以使用`arr`指针来访问这些内存。*/int* arr = (int*) malloc(sizeof(int) * 10);// 使用`malloc`函数分配内存后,我们需要负责手动释放这些内存空间。否则,这些内存将一直占用直到程序结束。free(arr);return 0;
}
七、结构体和联合体
1.结构体
结构体是一种用户定义的数据类型,可以用来存储多个不同类型的数据项。结构体可以包含多个成员,每个成员可以是任意数据类型,包括基本类型(如整数和浮点数)和其他结构体类型。
// 结构体的定义
struct 结构体名 { 数据类型 成员1; 数据类型 成员2; ... 数据类型 成员n;
};
/*** C语言结构体*/
#include <stdio.h>
#include <string.h>// 定义一个表示学生信息的结构体,包含姓名、年龄和分数三个成员
struct student {char name[20];int age;float score;
};int main() {// 声明结构体变量struct student s;// 给结构体中的成员赋值strcpy(s.name, "Tom");s.age = 18;s.score = 90.5;// 直接访问结构体中的成员printf("Name: %s\n", s.name);printf("Age: %d\n", s.age);printf("Score: %.2f\n", s.score);// 通过指针访问结构体的成员struct student *p = &s;printf("Name: %s\n", p->name);printf("Age: %d\n", p->age);printf("Score: %.2f\n", p->score);return 0;
}
八、常用函数
- printf():用于打印输出。
- scanf():用于输入数据。
- strcmp():用于比较两个字符串是否相等。
- strlen():用于获取字符串的长度。
- strcpy():用于将一个字符串复制到另一个字符串。
- strcat():用于将一个字符串连接到另一个字符串的末尾。
- atoi():用于将字符串转换为整数。
- atof():用于将字符串转换为浮点数。
- rand():用于生成随机数。
- malloc():用于动态分配内存。
- free():用于释放动态分配的内存。
总结
看到这里大家应该也能够对于C语言有个基本的了解了吧,对于考研中的408C语言中的知识差不多也就是上面那些了。
了解了C语言的基本知识之后就可以开始学习数据结构了。
如果大家还是不懂的话可以直接去看B站上面老师们的视频,或者看看下面的参考资料。
参考资料
- 《C Primer Plus》第六版
- 计算机 408 历年考研真题
- 计算机 408 考研大纲
- ChatGPT
- 牛客网C语言入门教程