1、头文件中的ifndef/define/endif有什么用
防止该头文件被重复引用
2、#include<filename.h>和#include"filename.h"的区别
对于#include<filename.h>,编译器从标准库路径开始搜索"filename.h"
对于#include"filename.h",编译器从用户的工作路径开始搜索"filename.h"
3、引用和指针的区别是什么
(1)引用本身是变量的别名,对引用的操作就是对变量本身的操作
(2)引用必须要被初始化,指针可以不被初始化
(3)引用被初始化后不可以改变,指针可以改变所指的对象
(4)不存在指向空值的引用,存在指向空值的指针。就是说引用不可以引用空值,而指针可以指向空值。
4、函数参数入栈顺序
C语言函数参数入栈顺序是从右往左的,这是由编译器决定的,更具体的说是函数调用约定决定了参数的入栈顺序。
int a = 10, b = 20, c = 30;
printf("%d,%d,%d\n", a = a + b, b = b + c, c = c * 2); //a=90,b=80,c=60
5、const的用法
关键字const用来定义常量,与预编译define相比,有以下的优点:
(1)预编译指令只是对值的简单的替换,不能进行类型检查
(2)可以保护被修饰的东西,防止被意外修改,增加程序的健壮性
(3)编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高
const常在以下几个方面使用
(1)修饰局部变量
const int n=5;
int const n=5;//两种写法一样,用const修饰变量一定要初始化
(2)常量指针与指针常量
(3)修饰函数的返回值
(4)修饰函数的参数
(5)修饰全局变量
6、inline内联函数
定义:在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间和栈内存的大量消耗
为了解决这个问题,特别的引入了inline修饰符,表示为内联函数
目的:减少函数调用的开销
用法:在函数返回值前加修饰符inline:如
inline int fun(int n);
编译器会在源文件的合适位置生成函数代码的副本,以避免函数调用。从函数角度来看,相比inline,宏虽然同样能减少函数调用的开销,但宏有着无法回避的天生缺陷
优势:inline函数会像宏一样展开,执行速度非常快
局限:
(1)建议:定义inline内联函数,实际上是对编译器的“建议”,编译器可能会拒绝
(2)小函数:inline函数如果代码量过大,编译器几乎不可能采纳内联函数的“建议”
(3)限制:inline内不可以含有复杂的结构控制语句例如while,switch等,并且内联函数本身不能是递归函数