第1周:指针与字符串——1.2 指针运算

2017-06-12  本文已影响0人  hyt222

1.指针加1?

对指针加 1 的动作,意味着要把它移到下一个单元去。它的地址值上加一个 sizeof 那个指针的类型。

int a[10];  int *p = a;   *(p+1) 指向 a[1]  *(p+n) 指向 a[n]

如果指针不是指向一片连续分配的空间(如数组),则这种运算没有意义。

2.指针计算

两个指针相减得到两个地址之间有几个这样类型的东西在。


3. *p++

取出 p 所指的那个数据来,完事之后顺便把 p 移到下一个位置去。

* 的优先级虽然高,但是没有 ++ 高。

常用于数组类的连续空间操作。

4.指针比较

指向a[0]的指针比指向a[5]的指针小


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);

上一篇 下一篇

猜你喜欢

热点阅读