【C_Language】你必须知道的----C语言笔试面试中经典易错的一些知识点(持续更新)

1. 关于二级指针的解析和引用
  1.1  二级指针意义
   二级指针存放的是一级指针的地址    Ex:

1 Int a = 5; 
2 Int *p = &a;
3 Int **q = &p;


  1.2. 为啥要用二级指针
  如果将一个指针作为形参传入某个函数,并在函数体内进行判断,改变该指针的指向,形参必须设置为二级指针,也就是将原指针的地址传入才可以,否则,根据函数体在临时栈中执行,如不传入地址,它使用的是形参指针在栈中的一个copy,函数体执行完毕后,即被释放掉


2. 关于指针的类型指向
  a. 指针是有类型的,其类型决定了指针+1,越过多少个内存单元
  b. Char *p | p+1,实际增加一个内存单元
  c. Int *p | p+1,实际增加四个内存单元
3. C语言的压栈顺序是自右向左压,因此在面对打印形参指针的时候,要注意从右向左边看
4. “=”连续赋值是从右向左边赋的
5. sizeof()在计算数组的长度的时候,计算数组中有的字符的个数,但是不会计算字符串最后的‘\0’

1 Char str[]="hello"
2 Sizeof(str) = 6

//列出C中会用到的关键字的长度
Sizeof(char) = 1
Sizeof(short) = 2
Sizeof(int) = 4
Sizeof(double) = 8
Sizeof(long long) = 8

6. 关于指针的几种定义方式
  a. 一个有10个指针的数组,该指针是指向一个整型数的;
    1) int *  a[10]
  b. 一个指向有10个整型数数组的指针;
    1) int (*a)[10]
  c. 一个指向函数的指针,该函数有一个整型参数并返回一个整型数;
    1) int (*a)(int)
  d. 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数;
    1) int (*a[10])(int)


7. 单纯的指针变量如果仅仅声明并且指向了一个指向,并没有开辟相应的内存,且如果指针直接指向一个字符串常量,那么该段空间分配在文字常量区,是不可修改的

  ex:   int *ptr = "hello";  ptr[1] = 'c'      这样的赋值是非法操作

 

8. 希望程序跳转到0x100000去执行

1 * (void (*)())0x100000
(void (*)()) 将0x100000强制转换成函数指针类型,再通过*取该地址里所存储的函数的入口地址

9. switch的参数不可以为实型,同时switch在执行的时候,请注意如下规则:

 1 int a = 5;
 2 int b = 3;
 3 switch(b):
 4 {
 5     case 1:
 6         a = 1;
 7         printf("a = %d\n", a);
 8         break;
 9     case 2:
10         a = 1;
11         printf("a = %d\n", a);  

 

12     case 3:
13         a = 4;
14         printf("a = %d\n", a);
15         break;
16     default:
17         a = 4;
18         printf("a = %d\n", a);   

 

19 }

 输入:b=1 输出:a=1
 输入:b=2 输出:a=2, a=3
 输入:b=3 输出:a=3
 输入:b=4 输出:a=4

10. 中断服务函数1)不可以有返回值,2)也不可以传参数,3)中断函数中做浮点运算不划算,4)最好不要使用printf函数
11. 无符号型数字和有符号型数字放在一起运算的时候,会强制转换为无符号型
12. strcpy函数本身就可以实现copy,为何返回char *的类型: 伟大的链式表达

13. 堆和栈的区别?
  a. 存储内容不同
    i. 栈中存放局部变量还有参数,以及调用函数的入口地址 堆中那种由程序员具体指配
  b. 管理方式不同
    i. 栈由系统自动分配并释放内存,生存周期结束后被自动释放,堆需要程序员指定大小手动申请和手动释放
  c. 空间大小不同
    i. 栈的空间小,堆的空间根据系统的有效虚拟内存有关,比较灵活空间也比较大
  d. 是否会产生随便不同
    i. 栈是连续的,不会产生碎片 堆是链表的存储方式,会产生碎片
  e. 生长方向不同
    i. 栈向低地址扩展域 堆向高地址扩展
  f. 分配方式不同
    i. 栈有静态和动态分配 堆是动态分配
  g. 分配效率不同
    i. 栈分配的速度比较快,程序员无法控制 堆速度慢,容易产生碎片
14. volatile和register
  a. volatile是一种类型修饰符,用它修饰的变量表示有可能被编译器优化,从而导致有些进程或者程序取用该值时得不到真实的值
  b. 对于某些高频使用的变量可以声明为register类型,表明该变量会存储CPU的寄存器中,而不是通过内存寻址访问,以提高效率。
15. 大端和小端的问题
  Intel support 小端
  Motorola support 大端
  ARM both support
    Ex:      Int a = 0x12345678

         

16. 线程与进程的区别和联系?线程是否具有相同的堆栈?dll是否有独立的堆栈
17. 对于一个频繁使用的短小函数:    C语言中使用宏定义,C++中使用inline
18. 软件测试都有哪些种类
  黑盒:针对系统功能的测试 白盒: 测试函数功能,各函数接口



 

posted @ 2019-03-27 17:16  一粒厘米  阅读(901)  评论(0编辑  收藏  举报