指针
一、内存和地址
- 内存中的每个位置由独一无二的地址标识
- 内存中的每个位置都包含一个值
- 变量名字与内存位置的关联并不是硬件提供的,它是由编译器为我们实现的。
- 硬件仍然通过地址访问内存位置
二、值和类型
int a = 112,b = -1;
float c =3.14;
int *d = &a;
float *e = &c;
- 我们都知道,数据在内存中都是以二进制的形式储存的,也就是说变量在内存中的内容是一序列的0或者1的位,一序列的0或者1的位可以被解释为整数,也可以被解释为浮点数,因此我们判断一个变量是整型还是浮点型,其实是取决于变量的使用方式。
- 因此我们得出一个很重要的结论:不能简单的通过检查一个值得位来判断它的类型。
三、间接访问操作符
- 通过一个指针访问它所指向的地址的过程称为间接访问或者是解引用指针。
- 执行间接访问的操作符是单目操作符*

- 实线的记法容易让用户产生误解,会以为指针执行了间接访问操作,但实际上间接访问操作不一定会执行。
- 事实上,如果不对指针进行间接访问操作,它的值只是简单的一些位的集合,只有在执行访问操作时,箭头才表示实际发生的内存访问。
四、未初始化和非法的指针
int *p;
........
*p = 12;
- 这里声明了一个名叫p的指针变量,并把12赋值个p指向的内存位置。
- 但是,声明p并未对p进行初始化,此时我们不是的p是指向哪个内存位置,因此我们无法预计12会存储在哪个位置。
- 空指针NULL,表示某个特定的指针目前并未指向任何东西。
- 对一个空指针进行解引用操作是非法的。
五、指针的使用实例
5.1计算一个字符串的长度
#include <stdlib.h>
#include <stdio.h>
size_t Strlen(char* string)
{
int length = 0;
while(*string++ != '\0')
length += 1;
return length;
}
- 在指针到达字符串末尾的NULL字节之前,while语句中的*string++表达式的值一直为真,它同时增加指针的值。