C语言面试总结

1、程序编译的过程

在这里插入图片描述

2、const和define的区别

  1. #define是在编译的预处理阶段起作用(在预处理阶段进行替换)。
  2. #define只是简单的字符串替换,没有类型检查。
  3. #define只是进行展开,有多少地方使用,就替换多少次。
  • List item
  1. const是在编译运行的时候起作用(const修饰的只读变量是在编译的时候确定其值)。
  2. 而const有对应的类型,是要进行判断的,可以避免一些低级的错误
  3. const定义的只读变量在程序中只有一份备份

3、static的作用

  1. static可以在不同的文件中定义同名变量和同名函数。。
  2. 在模块内(函数外)可以被模块内的函数访问,而不能被模块外的函数访问。
  3. static定义的函数被限制在他本地使用

4、volatile的作用

程序的变量是放在寄存器里面的,当我们用到这个变量的时候,就会从寄存器里面读取这个变量的值,只有当变量在函数内部被改变的时候,寄存器的值才会更新,和内存保持一致,当变量在其余地方被改变的时候,寄存器的值是不会变的,这个时候提取的值就是错误的,volatile的作用就是可以让我们再运用的时候直接去内存里面拿最新的值。

5、对寄存器进行操作

设置a的bit3和关闭a的bit3,要求在这个其他过程中不改变其余的bit。

#define Bit3  (0x01 << 3)
void set_bit()
{
	a |= Bit3;
}
void clean_bit()

{
	a &=~ Bit3;
}

6、无符号数的判断

#include <stdio.h>
void foo(void)
{
    unsigned int a = 6;
    int b = -20;
    (a+b > 6) ? puts("> 6") : puts("<= 6");
}
int main()
{
        foo();
        return 0;
}
~            

在这里插入图片描述这里输出 >6 .
原因是当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。因此-20变成了一个非常大的正整数,所以该表达式计算出的结果大于6。

7、引用和指针的区别

(1). 指针是一个实体,而引用仅是个别名;
(2). 引用使用时无需解引用(*),指针需要解引用;
(3). 引用只能在定义时被初始化一次,之后不可变;指针可变;
(4). 引用没有 const,指针有 const,const 的指针不可变;
(5). 引用不能为空,指针可以为空;
(6). “sizeof 引用”得到的是所指向的变量(对象)的大小, 而“sizeof指针”得到的是指针本身(所指向的变量或对象的地址)的大小;
(7). 指针和引用的自增(++)运算意义不一样;

8、数组和指针的关系

指针指向的是内存中的一个地址。
数组指向的这个内存中的一个地址的内容。

#include <stdio.h>

int main()
{
        int a[] = {1,2,3,4,5,6,7,8,9,0};
        int *p = &a[1];
        printf("p[6] = %d\n",p[6]);
        return 0;
}

在这里插入图片描述这里的p被赋予的是a[1]的地址,也就是2.

9、静态库和动态库的区别

静态库:程序在编译时需要,程序在运行时不需要。
动态库:程序在编译时不需要,运行的时候需要。

10、怎么去判断一个占用的大小

sizeof();

11、大端和小端之间的区别

大端:高字节保存在低字节地址上
小端:高字节保存在高字节地址上

例如;int a = 0x12345678
a的首地址是 0x2000

大端的存储模式:

0x2000   0x2001   0x2002  0x2003
0x12	 0x34     0x56    0x78

小端的存储模式:

0x2000   0x2001   0x2002  0x2003
0x78	 0x56     0x34    0x12

12、程序的四个区域

全局区:存放一般常量、全局变量的地方
代码区:存放代码的地方
堆区:需要程序员手动释放,malloc;free,堆区很大。
栈区:编译器自动释放,栈区很小。

13、什么是平衡二叉树

当且仅当两个子树的高度差不超过1时,这个树是平衡二叉树。

14 、数组与链表的区别

数组中的数据在内存中的按顺序存储的
链表的数据在内存中的是随机存储的

15、什么是内存泄漏,如何解决

内存泄漏就是开辟空间使用过后,程序没有对这一片内存进行释放处理,这片内存一直被在占用;
记得开辟空间过后,释放。
malloc -> free
new ->delete

16、结构体大小的计算

以结构体中占用字节最多的为标准,其余的按照此标准进行填充。

struct s1()
{	
	char a;			//占用1字节
	int b;			//占用4字节
	int c;			//4字节
	long d;			//8字节
	char e;			//1字节
};

按照8个字节位一个标准。
char a 和 int b 一共占用5字节,加上 int c占用9个字节,所以int c不能和 a,b一起公用。
为了保证对齐,所以系统会把 a和 b占用的空间补上,所以a和b一共占用8字节。
c同样的 不能家d所以也要求对齐,占用8字节。
d占用8字节,无需补位。
e也占用8字节,补7个字节。
所以strcut s1 一共占用 32个字节的大小。

17、倒序输出字符串

#include <stdio.h>
int main()
{
	char s[30];
	printf("请输入一串字符串:");
	gets(s);
	printf("输入的字符串为:%s\n",s);
	int a = sizeof(s)/sizeof(s[0]);
	printf("输出的字符串为:");
	for(int b = a-1; b >=0;b--)
	{
		printf("%c",s[b]);}
	printf("\n");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永不秃头的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值