1.NUL和NULL的区别
NULL代表指针不指向任何地方,NUL是代表字符串的结尾。字符串以’\0'结尾,NUL是'\0'的一个宏,需要自己定义
2switch中没有任何符合条件的case的情况怎么处理?
有default则运行default,没有则整个switch什么都不做
3 默认缺省关键字的函数是全局可见吗
void fun1(){...}这样的函数是全局可见的,任何链接到它所在文件的任何东西都可以看到它,所以extern根本可以不用加,只需要加static,确保它只能在本文件可见。
4.C中的声明可能非常复杂,解析声明需要用到神奇的解码环,具体看下面链接
https://www.cnblogs.com/cuckoos/articles/5247125.html
个人看法,主要分三步
1.先找到最左侧的标示符
2.先和右侧结合,再和左侧结合
3.结合的时候遇到括号停止
5.typedef 用于简洁的表示指向其他东西的指针
typedef int int32_t;
typedef void(*ptr_to_func)(int); 定义ptr_to_func标示符为一个函数指针,指向返回void,参数是int的函数
相比define,typedef是彻底的封装,不可以进行扩展
typedef int banana;
unsigned banana x; 非法!
6.数组名到底是不是左值?
数组名是左值,但是它是不可修改的左值.意思是不能把数组名作为赋值对象。
*(a+1)=100;然而这样的赋值还是可以的,因为赋值的对象不是简单的数组名
7.数组和指针的关系
1.所有作为函数参数的数组,都被C当成了指针,这是出于效率的考虑。传递一个首地址进去比赋值一整个数组要简单。
2.在表达式中的数组名就是一个指针
3.C把数组的下标当做指针的偏移量
实际上,只有在一个文件声明问指针,另一个文件定义为数组的情况下,会发生冲突。
8 C中为什么不对数组下标访问做越界检测?
没有意义,因为对数组的访问可以通过指针和下标实现,可以杜绝下标访问越界,但是不能杜绝指针越界。