C语言学习笔记(2)
一. 数组与指针
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.PTA
解决: 通过查询资料得知:(*p)++ 先取指针p指向的值,再将该值自增1
2.* p++的含义
解决: 单目运算符 * 级别低于 ++ 及取出 P 中的值之后把P移到下一个位置。
总结:
1. *p++、(* p)++、* ++p、++* p 的区别
(1). *p++ 先取指针p指向的值,再将指针p自增1;
(2). (*p)++ 先取指针p指向的值, 再将该值自增1;
(3). *++p 先将指针p自增1, * 操作再取出该值;
(4). ++*p 先取指针p指向的值, 再将该值自增1;