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 *的类型: 伟大的链式表达