一. 数组与指针
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移到下一个位置。