1. 内存四区
a)代码区 存放代码
b)全局区 全局的常量(字符串常量 “abc”) 全局变量
c)栈区 系统自动开辟,系统自动释放。 并不是很大
d)堆区 动态开辟的内存,手动开辟,手动释放。 大.
i. 链表、数据结构、算法、动态结构体
2. 地址:把内存以单个字节为单位,分开。每一个字节编号,这个编号就是地址
a) 编号时连续的
b) 唯一的
c) 取地址运算符:&单目运算符优先级只比 () 、[] 、 . 这三个低。 结合性右往左
3. 首地址:一段内存空间中第一个存储单元的地址
4. 指针变量:1. 用来存放地址的变量。 2. 内存大小4B(字节)
a) 地址是一些编号,是一种数据
i. 整数 int a;
ii. 字符 char c;
iii. 小数 float b;
iv. 地址 指针变量
b) 指针变量的定义
i. 数据类型 *变量名
ii.int*p; 定义一个指针变量p,p存的是地址
iii.int 表明在p变量存放的地址的内存空间里面保存的数据类型是int
iv.* 指明p变量是一个指针变量
c) 指针变量的赋值:
i.int a =5;
ii. p =&a;// p指向a
d) 指针变量的引用:
i. 访问a这个int变量
1. 使用变量名 printf(a); 访问内存,结果为52. 指针访问 printf(*p); 访问内存,结果为5
a)*指针变量 这个 * 是取值运算符。返回某一个地址中的值。单目运算符
结合性右向左
b)int*p; 在定义指针变量的时候,这个 * 只是表明p是一个指针变量
c) 非定义时, *p, 取值,取p指向的内存的值
5. 野指针:不能明确指向的指针变量 危险
a) 类似 int a; 不知道a的值是多少,可能随机一个-847372数
b)int*p;//p里面保存的地址是不确定的,p指向是不明确的。所以有可能操作到重要数据
c) 怎么解决野指针:int*p =NULL;6. 空指针:void* 没有确定内存开辟出来之后,要存什么数据时,就定义空指针
a) 明确类型后:将void* 强制转换成其他的数据类型
7. 指针变量的运算:(4个)+-++--
a) 指针偏移,去访问地址旁边的一些内存
b) 指针变量的加减,以指针所指向的类型空间单位进行偏移
i.char*p;// p char 1 p+1 1B
ii.int*p1;// int 4 p1+1 4B
iii.double*p2;// double 8 p2+1 8B8. 一维数组与指针: int a[5];
a) 定义一个一维数组,数组名a是这个数组的《首地址》
i. a的类型:int*
ii. a指向a[0], a[0]是一个int的元素
iii.printf(a,&a); 两个值都是地址,且值一样
iv.printf((a+1),(&a+1)); 相差20个字节
v. 结论:a这个地址指向a[0] a[0]是一个int元素 a+1 加4B
a的类型:int*
vi.&a这个地址指向整个数组 &a+1 加20B
&a的类型: int(*)[5];
b) 访问数组元素:
i. 下标法:a[i]
ii. 指针法:1.