你必须知道的----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 *的类型: 伟大的链式表达


猜你喜欢

转载自www.cnblogs.com/szhb-5251/p/10608966.html