C语言错题总结

16位、32位、64位各类型大小

类型16位32位64位
char1字节8位1字节8位1字节8位
short2字节16位2字节16位2字节16位
int2字节16位4字节32位4字节32位
long4字节32位4字节32位8字节64位
long long——8字节64位8字节64位
void*指针2字节16位4字节32位8字节64位

格式输出

在这里插入图片描述
printf(格式化串,参数…)
格式化:‘%’+格式字符(‘%’+无效字符直接打印无效字符)
要打印 % 需要用连续两个 %

在这里插入图片描述

%5.3s 输出为五列,三个字符 所以为(两个空格)+ com
%m.ns 输出占m列,但只取字符串中左端n个字符。这n个字符输出在m列的右侧(靠右对齐),左补空格。


if else匹配,|| 运算

在这里插入图片描述

  1. if和else的配对原则 if else是就近配对的
    在这里插入图片描述

  2. 逻辑或 || ,当 || 左边表达式成立时右边表达式不会执行

指针

指针运算

在这里插入图片描述
*运算符优先级: (后缀++) > (前缀++) > (解引用 ) > (加法+) > (以…加 += )
A:(*p+=1)》 (*p) += 1 》 year += 1
B:(*p)++ 》 year++
C:++ (*p) 》 ++year
D:*p++ 》 (p++) 因为后缀++优先级高于解引用 , 先对p指针进行后置++(后置++,先使用值再自增,效率低于前置++,因为要开辟临时空间,++i可以做左值,i++不行),然后解引用p,对p指针+1。


在这里插入图片描述
malloc() / free() 都只会申请释放内存空间,不会改变里面的数据(酒店退房)。

const指针

在这里插入图片描述
const使用(const int *p,int const *p,和int * const p二)
常量指针:(表示这个指针是一个指向常量的指针(变量)。指针指向的对象是常量,那么这个对象不能被更改。)
const int* p 和 int const *p 等价,const 修饰p指针解引用之后结果,表示p所指向的内容不能改变,只能改变指向(的地址)

指针常量:(本质是一个常量,是指针类型的常量)
int* const p ,const修饰指针p,表示p的指向(地址)不能改变,可以解引用改变指向内容的值

数组指针

在这里插入图片描述
在这里插入图片描述

结构体对齐

每个成员偏移地址都要对齐; 结构体整体是对齐数的整数倍
在这里插入图片描述
结构体内存对齐 (位段、联合union)
位段:(内存对齐!)不支持跨平台
应用:ip数据报头

大小端

在这里插入图片描述
32位平台long long 占4字节,%d 格式输出4字节
 低地址 ————————————> 高地址
    0X 01 00 00 00 00 00 00 00
    0X 10 00 00 00 00 00 00 00
    0X 11 00 00 00 00 00 00 00
printf是标准库的格式输出函数,开辟函数栈帧(栈向地址减小方向增长);LIFO后进先出,c,b,a入栈存储
在这里插入图片描述

数组

二维数组

在这里插入图片描述
在这里插入图片描述


在这里插入图片描述
二级指针数组,是数组,数组元素是数组的元素是指针,指针所指向的地址是二维数组的地址**(二位数组的一维元素任意,二维必须是4个)**

在这里插入图片描述

对&arr+1相当于加整个数组的大小:&arr+1 = arr+sizeof(arr)


在这里插入图片描述
p+1就是二维数组加一行,*p+1指向p所指向行数的下一个元素。本题p指向二维字符数组a,二维数组的每行分别是三个字符串一维字符数组,起初p指向第一行morning, p++指向afternoon所在行,由于打印字符串的首地址等于打印字符串,所以打印完整的afternoon,而不是a的首地址

在这里插入图片描述

循环

在这里插入图片描述
A: 当while循环的条件表达式是赋值语句的时候,其含义为:先执行赋值语句,然后对左值进行判断。(如果输入不是’\n’那(getchar()!=‘\n’)为1,(ch=1)这里赋值,所以还是while还是会执行的)如果左值为0则expr为假,while退出;否则expr为真,while继续循环,所以不会出现死循环,当然这种写法是不标准的编译器会给出警告
D: for循环初始化条件只会一次,然后死循环判断


递归

在这里插入图片描述
类斐波那契
在这里插入图片描述

下列代码输出结果是:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现记录功能,可以使用文件操作来存储和读取信息。以下是一个简单的 C 语言代码示例: ```c #include <stdio.h> #include <stdlib.h> #define MAX_SIZE 100 // 最大数 // 定义结构体存储信息 typedef struct { int question_num; // 号 char question[100]; // 目 char answer[100]; // 答案 char explanation[200]; // 解释 } Question; // 存储信息到文件 void save(Question* questions, int size, char* file_name) { FILE* fp; fp = fopen(file_name, "w"); if(fp == NULL) { printf("无法打开文件\n"); exit(1); } for(int i = 0; i < size; i++) { fprintf(fp, "%d %s %s %s\n", questions[i].question_num, questions[i].question, questions[i].answer, questions[i].explanation); } fclose(fp); } // 从文件中读取信息 void load(Question* questions, int* size, char* file_name) { FILE* fp; fp = fopen(file_name, "r"); if(fp == NULL) { printf("无法打开文件\n"); exit(1); } int i = 0; while(fscanf(fp, "%d %[^\n] %[^\n] %[^\n]\n", &questions[i].question_num, questions[i].question, questions[i].answer, questions[i].explanation) != EOF) { i++; } *size = i; fclose(fp); } int main() { Question questions[MAX_SIZE]; int size = 0; // 读取文件中的信息 load(questions, &size, "questions.txt"); // 在此处添加代码,实现记录功能 // 存储信息到文件 save(questions, size, "questions.txt"); return 0; } ``` 在上述代码中,我们定义了一个 `Question` 结构体来存储每一道的信息。`save` 函数将信息存储到文件中,`load` 函数从文件中读取信息。你可以在 `main` 函数中添加代码来实现记录功能,比如让用户输入目和答案,将输入的信息存储到结构体数组中。最后,调用 `save` 函数将更新后的信息存储到文件中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值