指针
一、内存与地址
在要求边界对齐的机器上,整型值存储的起始位置只能是某些特定的字节,通常是2 或4 的倍数
二、间接访问操作符
通过一个指针访问它所指向的地址的过程称为间接访问(indirection)或解引用指针(dereferencing
the pointer) 。这个用千执行间接访问的操作符是单目操作符*
三、指针常量
int* a = 100;
*100 = 25;
看上去像是把25 赋值给a, 因为a 是位置100 所存储的变量。但是,这是错的!这条语句实际上是非法的,因为字面值100 的类型是整型,而间接访问操作只能作用于指针类型表达式。
如果你确实想把25 存储于位置100, 你必须使用强制类型转换。非常不支持
*(int *)100 - 25;
四、指针表达式
char ch ='a';
char *cp = &ch;
表达式 &ch
- 作为右值,这个表达式的值是变量ch 的地址。
- 作为左值使用时,是不合法的。当表达式&ch 进行求值时,它的结果应该存储于计算机的某个地方,但你无法知道它位千何处。这个表达式并未标识任何机器内存的特定位置,所以它不是一个合法的左值。
表达式 cp
- 右值是cp 所处的内存地址中保存的值,即ch的内存地址
- 左值就是cp 所处的内存地址值。
表达式 *cp
- 右值是ch所处内存地址中保存的值,即 ’a’;
- 左值是ch 所处的内存地址值。
cp和
表达式 *cp + 1
- 右值是cp指向的内存地址中保存的值 + 1,即’b’
- 左值非法
表达式 *(cp + 1)
- 右值是cp指向的内存地址 + 1字节 后 的内存地址中保存的值的值。
- 左值是cp指向的内存地址 + 1字节 后 的内存地址。
表达式 *cp++
++操作符产生cp 的一份拷贝
然后++操作符增加cp 的值
最后,在cp 的拷贝上执行间接访问操作
- 右值和左值分别是变量ch 的值和ch 的内存位置,也就是cp 原先所指。
表达式 *++cp
- 间接访问操作符 * 作用于增值后的指针的拷贝上,所以它的右值是ch 后面那个内存地址的值,而它的左值就