一. 数组与指针
1. 函数参数表中的数组实际上是指针
- sizeof(a) == sizeof(int * );
- int a[ ] ? int *a
以下四种函数原型是等价的:
- int sum (int *ar, int n);
- int sum (int ar[ ], int n);
- int sum (int *, int);
- int sum (int[ ],int);
2. 数组变量是特殊的指针
数组本身表示地址,
- int a[10];
- int *p = a; // 无需用 & 取变量
数组的单元表达的是变量, 需要用 & 取地址.
[ ] 运算符可对数组做, 也可对指针做 ;
p[0] ? a[0]
* 运算符可以对指针使用, 也可对数组做;
数组变量是类型 const 指针, 因此不能变赋值;
int a[ ] ? int *const b;
二. 指针运算
(1) 给指针加, 减一个整数 (+,+=,-,-=);
(2) 递增递减 (++,--);
(3) 两个指针相减;
1. 加减 :
指针加一即指针所指地址值加上一个 sizeof(指针所指类型), 移动到下一单元格.
指针 1 - 指针 2 结果是单元格之差, 并非地址的数值差:
- (指针 1 - 指针 2)/ sizeof(指针类型);
- 2. *p++
取出 p 所指的数据后, 把 p 移动到下一单元格;
用于数组类连续空间操作;
在某些 CPU 上, 这可以直接被翻译成一条汇编指令;
3. 指针比较
<, <=,==,>,>=,!= 可以对指针作比较 (比较内存中的地址);
数组中的地址是线性增加的.
4. 0 地址
0 地址通常是一个不能够随意碰的地址;
指针不应该具有 0 值;
用 0 地址通常表示特殊的事情:
返回值无效的;
指针没有被真正初始化.
NULL 是一个预定义的符号, 表示 0 地址
5. 指针类型
无论指向什么类型, 所有的指针的大小都是一样的, 因为都是地址;
指向不同类型的指针是不能直接相互赋值的; 这是为了避免用错指针.
6. 指针作用
需要传入较大的数据时用作参数;
传入数组后对数组做操作;
函数返回不止一个结果;
需要用函数来修改不止一个变量;
动态申请的内存.
我的手写笔记
MOOC 代码
产生的问题
1.* p++ 的含义
解决: 单目运算符 * 级别低于 ++ 及取出 P 中的值之后把 P 移到下一个位置.
来源: http://www.bubuko.com/infodetail-3452680.html