C语言错题总结

Posted -YIN

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言错题总结相关的知识,希望对你有一定的参考价值。

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循环初始化条件只会一次,然后死循环判断


递归


类斐波那契

下列代码输出结果是:

以上是关于C语言错题总结的主要内容,如果未能解决你的问题,请参考以下文章

C语言错题总结

C语言错题总结

C语言转义字符基础总结

001C语言选择题错题总结

关于C语言部分错题

C语言错题集2:分支与循环