- 关于二级指针的解析和引用
1.1 二级指针意义
二级指针存放的是一级指针的地址 Ex:
Int a = 5;
Int *p = &a;
Int **q = &p;
1.2. 为啥要用二级指针
如果将一个指针作为形参传入某个函数,并在函数体内进行判断,改变该指针的指向,形参必须设置为二级指针,也就是将原指针的地址传入才可以,否则,根据函数体在临时栈中执行,如不传入地址,它使用的是形参指针在栈中的一个copy,函数体执行完毕后,即被释放掉
- 关于指针的类型指向
a. 指针是有类型的,其类型决定了指针+1,越过多少个内存单元
b. Char *p | p+1,实际增加一个内存单元
c. Int *p | p+1,实际增加四个内存单元 - C语言的压栈顺序是自右向左压,因此在面对打印形参指针的时候,要注意从右向左看
- “=”连续赋值是从右向左边赋的
- 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
-
关于指针的几种定义方式
a. 一个有10个指针的数组,该指针是指向一个整型数的;
int * a[10]
b. 一个指向有10个整型数数组的指针;
int (*a)[10]
c. 一个指向函数的指针,该函数有一个整型参数并返回一个整型数;
int (*a)(int)
d. 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数;
int (*a[10])(int) -
单纯的指针变量如果仅仅声明并且指向了一个指向,并没有开辟相应的内存,且如果指针直接指向一个字符串常量,那么该段空间分配在文字常量区,是不可修改的
ex: int *ptr = "hello"; ptr[1] = 'c'
这样的赋值是非法操作
-
希望程序跳转到0x100000去执行
* (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);
输入:b=1 输出:a=1
输入:b=2 输出:a=2, a=3
输入:b=3 输出:a=3
输入:b=4 输出:a=4
-
中断服务函数需注意:
1)不可以有返回值,
2)也不可以传参数,
3)中断函数中做浮点运算不划算,
4)最好不要使用printf函数 -
无符号型数字和有符号型数字放在一起运算的时候,会强制转换为无符号型
-
strcpy函数本身就可以实现copy,为何返回char *的类型: 伟大的链式表达
-
堆和栈的区别?
a. 存储内容不同
栈中存放局部变量还有参数,以及调用函数的入口地址 堆中那种由程序员具体指配
b. 管理方式不同
栈由系统自动分配并释放内存,生存周期结束后被自动释放,堆需要程序员指定大小手动申请和手动释放
c. 空间大小不同
栈的空间小,堆的空间根据系统的有效虚拟内存有关,比较灵活空间也比较大
d. 是否会产生随便不同
栈是连续的,不会产生碎片 堆是链表的存储方式,会产生碎片
e. 生长方向不同
栈向低地址扩展域 堆向高地址扩展
f. 分配方式不同
栈有静态和动态分配 堆是动态分配
g. 分配效率不同
栈分配的速度比较快,程序员无法控制 堆速度慢,容易产生碎片 -
volatile和register
a. volatile是一种类型修饰符,用它修饰的变量表示有可能被编译器优化,从而导致有些进程或者程序取用该值时得不到真实的值
b. 对于某些高频使用的变量可以声明为register类型,表明该变量会存储CPU的寄存器中,而不是通过内存寻址访问,以提高效率。 -
大端和小端的问题
Intel support 小端
Motorola support 大端
ARM both support
ex: Int a = 0x12345678
-
线程与进程的区别和联系?线程是否具有相同的堆栈?dll是否有独立的堆栈
-
对于一个频繁使用的短小函数,C语言中使用宏定义,C++中使用inline
-
软件测试都有哪些种类
黑盒:针对系统功能的测试 白盒: 测试函数功能,各函数接口