1.指针加1?
对指针加 1 的动作,意味着要把它移到下一个单元去。它的地址值上加一个 sizeof 那个指针的类型。
int a[10]; int *p = a; *(p+1) 指向 a[1] *(p+n) 指向 a[n]
如果指针不是指向一片连续分配的空间(如数组),则这种运算没有意义。
2.指针计算
两个指针相减得到两个地址之间有几个这样类型的东西在。
3. *p++
取出 p 所指的那个数据来,完事之后顺便把 p 移到下一个位置去。
* 的优先级虽然高,但是没有 ++ 高。
常用于数组类的连续空间操作。
4.指针比较
5. 0地址
你的内存中有 0 地址(每个程序都有 0 地址),但是 0 地址通常是个不能随便碰的地址。所以你的指针不应该具有 0 值。
可以用 0 地址来表示特殊的事情:返回的指针是无效的;指针没有被真正初始化(先初始化为 0)。
NULL 是一个预先定义的符号,表示 0 地址。(有的编译器不愿意你用 0 来表示地址)。
6.指针的类型
无论指向什么类型,所有的指针大小都是一样的,因为都是地址。
但是指向不同类型的指针是不能互相赋值的(为了避免用错指针)。
7.指针的类型转换
void* 表示不知道指向什么东西的指针(计算时与 char* 相同,但不相通)。
指针也可以转换类型: int *p = &i; void* q = (void*)p; 这并没有改变 p 所指的变量的类型,而是让后人用不同的眼光通过 q 看它所指的变量。
8.用指针来做什么
需要传入较大的数据时用作参数;
传入数组后对数组做操作;
函数返回不止一个结果(需要用函数修改不止一个变量);
动态申请内存。
9. malloc 和 free
如果申请失败则返回 0 (NULL)。
错误用法: p = &i; free(p);
良好的习惯是,有一个指针出来了,先初始化为 0 。void *p = 0; free(p);