充实,便是一种幸福。
1. 指针的本质
指针的本质是一个地址,指针变量就是存放这个地址的存储单元。
2. 指针3要素
- 指针变量本身的地址。
- 指针变量的值,即一个地址。
- 指针所指地址的内容。
void main(void)
{
int value = 666;
int* pointer = NULL;
printf("指针变量本身的地址: %p\n", &pointer);
printf("指针变量的值: %p \n", pointer);
//printf("value: %x \n", *pointer);
//此时指针变量所指地址为空,若执行,则程序会crash
pointer = &value;
printf("指针变量本身的地址: %p\n", &pointer);
printf("指针变量的值: %p\n", pointer);
printf("指针变量所指地址的内容:%d\n", *pointer);
}
结果:
指针变量本身的地址: 00BDFCC8
指针变量的值: 00000000
指针变量本身的地址: 00BDFCC8
指针变量的值: 00BDFCD4
指针变量所指地址的内容:666
3. 指针的类型
(1) 指针的数据类型为指针所指地址内容的数据类型
(2) void *
4. 几种特殊指针
(1) 空指针:未分配或尚未指向任何地方的指针。C语言中通常用NULL表示。
-
典型应用:
□□ malloc()分配内存失败时,返回一个空指针;
□□ 指针初始化时,不知道指向哪儿时,可以初始化为空指针; -
注意事项:
(2) 未初始化的指针:表示指针被定义了,但未被初始化。未被初始化的指针,可以指向任何地方。
- 注意事项:对未初始化的指针进行引用,因为一切都不可知,所以是件非常危险的事情。因此,指针在创建时,要么指向合法的内存,要么初始化为空指针。
(3) 野指针:指向的地址不确定的指针。
- 野指针的产生:
□□ 未初始化的指针,乱指一通,即为野指针。
□□ malloc()动态申请的内存释放后,未将指向该内存的指针置为空指针。
□□ 返回局部变量指针
(4) 函数指针:指向函数地址的指针。利用函数指针可以知道函数在内存中的位置,因此可以利用函数指针调用函数。
-
函数指针声明:<类型> (*函数指针变量名)(函数参数列表)。
-
多态:一个名字定义不同的函数,这函数执行不同但类似的操作,从而实现“一个接口,多种方法”。
-
回调:系统函数调用用户函数,下层函数调用上层函数。
正常调用:用户函数调用系统函数,上层函数调用下层函数。
事件驱动采用回调机制。 -
多线程
(5) 字符串指针:指向一个字符串存储地址的指针。
5. 指针使用注意事项⚠️
- 指针在创建时,要初始化。
- 指针在使用时,要检查它是否为null。
- 动态内存释放后,需将该内存的指针置为null。