C语言选填考点归纳:
题号说明:例如:“27(3)”是指第三套的第27题,有下划线的是易错的,标红的是答案错了的
三套真题连接在文章末尾
1. 数据类型和运算符
- 位运算:在位运算中,操作数右移一位相当于该操作数除以2;左移一位相当于该操作数乘以2【题号: 28(3)】
- 模运算:模运算%的结果是除法运算后的余数,因此5%2的结果是1。【题号: 13(1),14(1),25(1),32(3),43(3)】
- 整除运算:整除运算/的结果是除法运算后的整数,例如8/5=1【题号:3(3),44(3)】
- 类型转换与表达式求值:在复杂表达式中,数据类型的转换和最终表达式的数据类型取决于操作数和所执行的运算类型:double(双精度)>float>int>char。【题号: 10(3),34(3)】
- 字符型常量、字符串常量、转义字符、字符串与字符串数组定义与元素存取和字符串处理函数:
字符型常量通过单引号括起来的单个字符表示,例如 'a'、'1' 或 '$'。
常见的字符型常量的ASCII码:’a’- 97; ’A’- 65
判断str为大写: (c>='A') && (c<='Z')【题号:8(1)】
字符串常量是由双引号 (") 包围的字符序列,可以包含任意数量的字符(包括0个字符,即空字符串)。字符串常量在内存中以字符数组的形式存储,并且自动以空字符('\0')结尾,这个空字符是字符串的终结符,标识字符串的结束,但不计入字符串的实际长度。【题号:29(1),38(3)】
转义字符是一些字符常量不能直接表示,通过在字符前加一个反斜杠(\)来表示,比如换行符('\n')、制表符('\t')或单引号('\'')【题号:2(3),12(3)】
char ch = 'a'; // 将字符 'a' 赋值给变量ch
printf("%c\n", ch); // 打印字符:a
printf("%d\n", ch); // 打印字符'a'的ASCII码值:97
char newline = '\n'; // 使用转义字符表示换行符
- 字符串与字符串数组定义与元素存取:
字符串
(1)定义方式:
①char str[] = "Hello, World!";
②char *str = "Hello, World!";
③char arr[] = "Hello, World!";
char *str = arr;
字符串数组定义方式:
①char *strArray[] = {"Hello", "World", "Example"};
②char strArray[3][10] = {"Hello", "World", "Example"};
(2)计算字符串占用内存字节的个数【题号:19(1)】
int fun(char *r)
{
char *t=r;
while(*t++);//循环会一直执行,直到t指向的字符为'\0'
return(t-r);// t和r都是指向字符的指针,t-r计算的是两个指针之间的距离,即字符串的长度(包括'\0')
}
- 字符串处理函数:【题号:5(2)】
(1)strcpy(str1,str2):把字符串str2复制给str1, 包括结束符'\0'。
char src[40] = "Hello World";
char dest[40];
strcpy(dest, src);
printf("dest: %s\n", dest); // 输出:dest: Hello World
(2) strlen(str): 计算字符串str的长度,不包括结束符'\0'。
char str[] = "Hello World";
printf("Length of '%s' is %zu\n", str, strlen(str)); // 输出:Length of 'Hello World' is 11
(3) strcat(str1,str2):连接str1和str2然后将结果赋值给str1
char dest[50] = "Hello";
char src[30] = " World";
strcat(dest, src);
printf("dest: %s\n", dest); // 输出:dest: Hello World
- 字符串赋值:
(1)直接赋值: char *s;s="ABCDEF";【题号:8(2)】
(2)用strcpy函数:
char src[] = "Hello World";
char dest[50]; // 确保有足够的空间
strcpy(dest, src);
(3)用指针:
char src[] = "Hello World";
char dest[50];
char *pSrc = src;
char *pDest = dest;
while (*pSrc != '\0') {
*pDest++ = *pSrc++;
}//高老师上课讲过的
*pDest = '\0'; // 添加字符串结束符
printf("dest: %s\n", dest); // 输出:dest: Hello World
- 数组:
(1)一维数组的定义方式
可以省略大小,但是不能小于实际大小【题号:11(1)】
int numbers[] = {1, 2, 3, 4, 5};
(2)二维数组元素的引用方式: 【题号:13(2)】
int array[3][4];以下对下标为i和j的数组元素的引用方式:
① array[i][j] ② *(*(array+i)+j) ③ *(array[i]+j)
array[i][j]是第i*4+j个元素【题号:9(1)】
- 逻辑运算符:&&是与、||是或、多重运算时从右往左看,整体如果满足则为1【题号: 6(3)】
- 关系运算符与关系表达式:关系表达式是用来比较两个表达式的值,并根据比较的结果返回一个逻辑值(真或假,即非零值或零),常见的有:“<,>,<=,>=,==,!=” 【题号: 18(1),11(3)】
关系表达式和逻辑表达式运算结果的值是0或1【题号:3(1)】
优先级: 比较运算符>加减运算符>逻辑运算符>赋值运算符【题号:7(1)】
2.标识符与关键字
- 合法标识符:标识符不能包含特殊字符(如*, %),不能是关键字(如int,void),也不能是数字开头,下划线和英文字母是可以的。【题号:1(1),2(2),1(3),15(3),16(3)】
- 关键字:关键字是C语言预定义的,具有特殊意义的单词,不能用作标识符。【题号:26(3)】
3. 函数
- return语句:return语句可以带有返回值,也可以不带返回值。一个函数可以有多个return语句,但一旦某个return语句执行,函数立即结束,没有返回值的函数没有return语句。【题号: 31(3)】
- 函数参数:实参和形参在函数调用过程中分别占用独立的存储单元。形参在函数调用时接收实参的值,实参和形参可以同名。数组名作为函数参数时传递的是数组的首地址。【题号: 12(1),6(2),33(3), 46(3)】
- 函数返回值类型:函数返回值的类型由函数定义时指定的类型决定。未指定返回类型的函数默认为int类型。【题号: 7(2),25(3),45(3)】
- main函数是程序的入口点,可以有参数,但不能被其他函数调用,且一个程序只能有一个main函数【题号:21(1),4(2)】
- 定义和调用: 函数的定义不能嵌套,但函数调用可以嵌套【题号:20()】
4. 控制结构
C程序的三种基本结构确实是顺序、选择和循环。【题号:2(1),】
- 循环和条件语句:
1]for循环:【题号: 30(1),18(3),24(3),37(3)】
(1)循环次数的确定性
for 循环既可以用于循环次数已经确定的情况,也可以用于循环次数不确定的情况。”例如:for(i=0,i<a,i++)”
(2)循环的执行顺序
for 循环的执行顺序是先对表达式进行判断,如果为真,则执行循环体语句,之后执行更新表达式,再次判断条件表达式,循环这一过程。
(3)可以使用break语句
在for 循环中,可以使用break 语句来提前终止循环,跳出循环体。break 语句使得循环控制更加灵活和精准。
(4)循环体的多条语句需用{}括起来
if条件语句的基本用法,包括循环体内使用break语句跳出循环的能力。【题号: 37(3)】
2]while
(1) while 循环
循环体的多条语句需用{}括起来,即在没有使用花括号 {} 的情况下,循环体或控制结构体只包含紧随其后的一条语句。【题号:9(3)】
(2)do-while语句
先执行循环体中的语句,然后判断条件表达式。如果条件表达式的值为真(非零),则继续执行循环体;如果条件表达式的值为假(零),则退出循环。这意味着循环体至少会被执行一次,无论条件是真是假。【题号:10(1),22(3)】
(3)switch-case语句【题号:16(1)】
1)表达式类型限制:switch语句的表达式必须是整型或枚举类型。这意味着表达式的结果可以是int、char等,但不能是float、double或指针类型。
2)case标签必须是常量表达式:每个case后面跟随的值必须是整型常量表达式,不能是变量或者是一个范围。
3)忘记break语句:如果在case块的末尾忘记写break,程序将会继续执行下一个case块的代码,直到遇到break或者switch语句的结束。这种行为称为“穿透”(fall through),有时可能是故意为之,但更多时候是一个错误。
4)默认情况下的default标签:default标签是可选的,但在多数情况下,添加default分支可以处理未预料到的情况。和case标签一样,如果default分支没有以break结束,也会发生“穿透”。
3]if
(1) else语句总是与其之前最近的且尚未配对的if配对【题号:7(3)】
- 条件表达式:条件表达式(三元运算符)的使用: condition ? exprIfTrue : exprIfFalse【题号: 4(3)、19(3)、48(3)】
4]continue
跳过当前循环的剩余部分,并直接进行下一次循环的条件判断, 对于 for 循环,意味着直接跳到增量表达式;对于 while 和 do-while 循环,意味着跳到循环的条件表达式。【题号:27(1),27(3)】
5]break
立即退出循环体, 不论是 for、while 还是 do-while 循环。
5.逻辑"真"和"假":任何非零值被视为真,零值被视为假。
(exp)?a++:b—中(exp)等价为exp!=0;
while( !a)语句中的!a与等价a==0
【题号:26(1), 5(3), 48(3)】
6.输入输出
- 基础输入输出函数:scanf用于从标准输入读取格式化输入,printf用于向标准输出打印格式化输出,putchar用于输出单个字符。【题号:5(1), 21(3), 30(3), 36(3), 47(3)】
7. 类型定义与内存
- typedef使用:typedef用于为现有的数据类型定义新的名称,例: typedef int v3【题号: 35(3)】
sizeof(char) == 1
sizeof(int) == 4
sizeof(long) == 8
sizeof(long long) == 8
sizeof(float) == 4
sizeof(double) == 8
sizeof(long double) == 16 // 取决于编译器
sizeof(int*) == 8 // 指针在64位系统上通常是8字节
sizeof(char[10]) == 10 // 数组的大小是元素大小乘以元素数量
8. 文件
- 文件打开和字符输入:【题号: 49(3), 50(3)】
使用fopen函数打开文件,并注意路径字符串中的转义字符FILE *fopen(const char *filename, const char *mode)。格式为"c:\\user\\text.txt"
fgetc函数用于从文件中读取一个字符,其文件打开模式应支持读取:读或读取。
- 文件结束判断:【题号: 15(2)】
feof函数在到达文件末尾时返回非零值,在未到达文件末尾时返回0。
- 文件类型和存储空间:【题号: 14(2)】
文本文件占用存储空间较多,二进制文件占用存储空间较少
9. 结构体【题号:15(1),42(3),】
- 定义和使用:
struct Student {
int id;
char name[50];
float percentage;
};
- 声明结构体变量:
struct Student student1, student2;
- 创建结构体数组:
struct Student students[3];
struct Student students[3] = {
{1, "John Doe", 85.5},
{2, "Jane Doe", 92.5},
{3, "Jim Beam", 78.9}
};
- 访问结构体成员:
student1.id = 1;
strcpy(student1.name, "John Doe");
//注: student1.name = "John Doe";是错误的
student1.percentage = 86.5;
10. 程序结构与基本语法
- 程序入口点:主函数main只能有一个,且是程序的入口点【题号: 20(3),41(3)】
- 基础语法:C语句以分号结束;复合语句可以视为单一语句;并非所有操作都由运算符实现,如函数调用等。【题号: 1(2)】
11. 指针和内存管理
- 指针定义:一个变量的地址称为该变量的指针,即指针是存储另一变量地址的变量。【题号: 29(3)】
- 数据一致性:一个指针变量只能指向同一类型变量。只有同一类型变量的地址才能放到指向该类型变量的指针变量之中。一个变量的地址可以被改变。【题号: 29(3), 30(3), 39(3)】
- 动态内存分配:用于在堆区(heap)分配一块指定大小的连续内存区域,并返回指向这块内存的指针。如果分配失败,malloc 返回 NULL。使用 malloc 分配的内存,在使用完毕后应该通过 free 函数释放,以避免内存泄漏。
- 指针运算与解引用:
指针的增加(减少)操作会使指针移动到下(上)一个元素的地址;也可以进行比较运算(==,!=,>=,<=)【题号:9(2),12(2),】
例: int s[5]={1,3,5,7,9}; int *p=s;
第m个元素:*(p+=(m-1)) 第2个元素3:*(++p)
解引用操作会取出指针指向地址的值。
(1)定义与释放【题号:30(3)】
int *p = (int *)malloc(sizeof(int)); // 分配足够存储一个int类型的内存,p是一个指针
if (p != NULL)
{
*p = 10; // 使用分配的内存
printf("%d\n", *p);
free(p); // 释放内存
p = NULL; // 避免野指针
}
(2)输入变量【题号:30(3)】
int *p = (int *)malloc(sizeof(int));
scanf("%d", p);// 输入的整数存储在 p 指向的内存位置,不要忘了scanf的后一个参数是变量存放的地址
易错:不能是scanf("%d", &p);&p是指针 p 自己的地址;
- sizeof用法:【题号: 4(1)】
sizeof是一个编译时操作符,用于计算变量或类型在内存中占用的字节数。对于字符串,sizeof返回的是整个数组的大小(包括'\0'),而strlen返回的是字符串的实际长度(不包括'\0')
例如: char t[]={'w', 'o', 'r', 'l', 'd'}, r[]="world";
printf("%d %d\n", sizeof(t),strlen(r));//输出: 6 5
- 指针与数组:【题号: 40(3)】
可以使用数组下标语法 a[i] 或通过指针运算 *(p+i) 来访问数组元素。直接引用指针 p 本身会得到元素的地址,而不是值。
指针数组: int *arr[3]; 包含3个指向int类型的指针的数组
数组指针: int (*ptr)[3]; 一个指向包含3个int元素的数组的指针【题号:11(2)】
命名规则:”…指针”:指向…的指针,“...数组”:有…的数组
- 指针与字符和字符串:通过指针操作字符串(字符数组)或单个字符时,可以直接通过解引用指针(*p)来修改指向的数据。【题号: 39(3)】
(1)指针与字符
char h; //定义一个字符变量 h。
char *s = &h; //定义一个指向字符变量 h 的指针 s。
*s='H';// 对 s 进行解引用,然后赋值。
(2)指针与字符串【题号:28(1),9(2)】
int s[5]={1,3,5,7,9};
int *p=s
设有 char *q=”helloC”; 则 printf(“%s”,q);的输出是helloC ;而 printf( “ %c”,*(q+1)) ;的输出则是e。
12. 宏定义【题号:17(2)】
易错点,不加括号,例: #define SQUARE(x) x*x
使用SQUARE(1 + 2)将会展开为1 + 2 * 1 + 2,结果为5,而不是预期的9。
正确写法应该是: #define SQUARE(x) ((x)*(x))
链接:https://pan.baidu.com/s/1NxcdqxddI_V_X2P3wqKEkQ
提取码:tuzq
--来自百度网盘超级会员V5的分享