C语言复习

Don’t be discouraged; it’s often the last key in the bunch that opens the lock.

C**语言知识点**

笔记本:知识点复习

创建时间: 2017/5/28 22:20 更新时间: 2017/8/6 21:50 作者:

​ 2401503224@qq.com

URL: http://blog.csdn.net/jolin678/article/details/48787191

1、 内存对齐

2、 大端小端

3、 函数调用栈桢

4、 进程的地址空间

5、 柔性数组

6、 函数指针

7、 程序生成的过程,编译链接过程

8、 宏的缺点。

9、 如何提高strcpy的效率。

10、 #ifndef和#pragma有什么区别

11、 实现atoi函数

http://blog.csdn.net/lf_2016/article/details/51549473

1、 内存对齐为什么要对齐

​ 访问未对齐的内存,处理器需要访问两次,而访问对齐的内存,只需要一次。为例提高效率,所以进行内存对齐。

内存对齐原则:

​ 结构体或联合体的数据成员、第一个成员放到0偏移的地方,以后每个数据成员放到自身对齐数的整数倍偏移处。(对齐数是变量自身大小和默认对齐数的较小值) 结构体的大小必须是最大对齐数的整数倍。

2、 大端小端

大端:高字节放到低地址、低字节放到高地址。小端:高字节放到高地址、低字节放到低地址。

3、 函数调用栈桢函数传参的时候是从右向左传:

例:

1
2
3
4
5
int main()
{ add(a,b);
}

img

4、 进程的地址空间

img

栈的大小:

​ windows下:虚拟内存中分配的大小是1M,物理内存中默认分配4k,可以被修改(project->setting->link)。 linux:linux下用ulimit查看的话是10M,可以被修改。堆的大小:

​ 虚拟内存中堆分配的大小是1M,物理内存中是4k,可以被修改。

5、 柔性数组柔性数组概念:

​ 结构体中的最后一个成员可以是一个不指定大小的数组,成为柔性数组。柔性数组前面必须还要有其他成员,可以动态的为柔性数组分配大小。结构体的大小不计入柔性数组的大小。

6、 函数指针

指向函数的指针就叫做函数指针。函数指针初始化的时候直接给指针赋值函数名,或者赋值为取地址函数名都是可以的。

用途:

​ 回调函数:将一个函数指针作为参数传递给其他函数。

​ 转移表:实际上是一个函数指针数组,就是一个数组里面放的全部都是函数指针。

7、 程序生成的过程,编译链接过程

答:编译链接过程分为预处理,编译,汇编,链接四个过程。

预处理:消除注释,替换宏,处理预处理指令,包含库文件编译:词法分析,语法分析,语义分析,优化处理汇编:把汇编语言翻译成目标机器指令,生成目标文件链接:将目标文件链接生成可加载,可执行的目标文件

8、 宏的缺点。

答:宏不能调试,没有类型检查,会带有副作用,宏会使得代码变得庞大。

9、 如何提高strcpy的效率。

答:strcpy是按一个字节进行拷贝的,可以把它转成int类型进行拷贝。

10、 #ifndef和#pragma有什么区别

答:#pragma once是微软独有,不支持跨平台,且它只要发现头文件被包含就不会打开头文件。而#ifndef是要每次打开文件判断头文件是否被包含的。所以总的来说#pragma编译的效率更快。

####11、实现atoi函数

答:实现atoi函数需要考虑以下问题:

指针为NULL 空字符处理正号和负号溢出处理异常字符处理