- 内存中的每个位置由一个独一无二的地址标识,内存中的每个位置都包含一个值
- 高级语言通过名字而不是地址来访问内存的位置,名字与内存位置之间的关联并不是硬件所提供的,它是由编译器为我们实现的,硬件仍然通过地址访问内存位置
- 指针存储的是其指向的地址,通过间接访问操作符*才能得到其指向地址中的内容
int a = 112,b = -1;
float c = 3.14;
int *d = &a;
float *e = &c;
表达式 | 右值 | 类型 |
---|
a | 112 | int |
b | -1 | int |
c | 3.14 | float |
d | 100 | int* |
e | 108 | float* |
*d | 112 | int |
*e | 3.14 | float |
- 在你对指针进行间接访问之前,必须非常小心,确保它们已被初始化!
如果变量是静态的,它会被初始化为0;但如果变量是自动的,它根本不会被初始化。
标准定义了NULL指针,它作为一个特殊的指针变量,表示不指向任何东西。对一个NULL指针进行解引用操作是非法的。
如果你已经知道指针被初始化为什么地址,就把它初始化为该地址,否则就把它初始化为NULL。
风格良好的程序会在指针解引用之前对它进行检查,这种初始化策略可以节省大量的调试时间。 指针的指针
int a = 12;
int *b = &a;
int **c = &b;
表达式 | 相当的表达式 |
---|
a | 12 |
b | &a |
*b | a,12 |
c | &b |
*c | b,&a |
**c | *b,a,12 |
- 间接访问操作符
*
是少数几个其结果为左值的操作符之一。 - 当一个指针和一个整数量执行算术运算时,整数在执行加法运算前始终会根据合适的大小进行调整,这个”合适的大小“就是指针所指向类型的大小。
- 指针运算只有作用于数组中其结果才是可以预测的。
- 如果两个指针都指向同一个数组的元素,那么它们之间可以相减
声明一个指针变量并不会自动分配任何内存。