Appearance
指针即数据在内存中的地址. 指针变量是存储指针的特殊变量.
定义指针变量
c
Type *name;指针变量的初始化
c
// [1] 使用相同数据类型的变量的地址,给指针变量进行初始化
int num = 3;
int *ptr = #
// [2] 使用地址的零(NULL),可以给指针变量初始化
int *ptr2 = NULL;
// [3] 使用一个已经初始化了的指针变量给另一个指针变量进行初始化
int *ptr3 = ptr;指针访问数据
c
printf("%d", *ptr);依然使用 , 但它在这里是运算符 , 在声明的时候是修饰符.
: 运算符, 取一般变量的地址 (当作为双目运算符的时候它是按位与): 运算符, 取地址中的数据
指针的大小
不同类型数据的指针大小是一样的, 它视操作系统位数而定, 比如 32 位系统, 地址大小是 4 字节, 所以只能找到 4 GB 内存. 64 位系统是 8 字节 ( 不过每次运行 C 程序只有 48 位大小, 这和编译器有关 )
指针运算
- 指针不能乘除
- 指针可以和指针比较 ( 进行加减 )
- 指针可以加减整数, 偏移
- 偏移大小和数据类型有关, 比如 int 的指针偏移 4 字节, char 的指针偏移 1 字节
- 偏移的方向和 字节序 有关系
特殊指针
- 野指针: 指的是随机地址的指针, 比如声明后没有初始化的指针
- 空指针: 保存 NULL 的指针
- 悬空指针: 原本有内容, 但因为内存释放, 地址失去意义的指针
- 万能指针: 指 void 类型的指针, 可以被赋值为任意一种指针
c
void *ptr;
printf("%p\n", ptr); // (nil)
printf("%p\n", ptr + 1); // 0x1c
int a = 3;
void *ptr = &a;
printf("%p\n", ptr); // 0x7ffea812ef3c
printf("%p\n", ptr + 1); // 0x7ffea812ef3d