- 地址(指针)是什么?
- 指针变量:
- 存储地址的变量;
- int a;
int* p = &a; //&a
返回变量
a
的首地址
c
、
*
解引用符号
,
用来操作某地址对应内存空间;
d
、
%p
打印地址(十六进制输出)
e
、
32
位占
4
个字节
64
位占
8
个字节
3
、空指针与野指针
空指针:值为
NULL
的指针
野指针:指向的空间没有使用权限
相同点:都不能解引用
一般使用指针时,如果没有直接初始化为一个可用的地址,需要置空。当指针不在使用时,也需要置空;好处:
所有不为空的指针都能解引用;
- 指针做函数的参数
本质也是值传递,通过对形参指针变量间接的修改
(
*
)
,
来实现对实参指针所指向数据的修改
- 传入参数 使用指针对应的变量中的数据
- 传出参数 修改指针对应的变量中的数据
- 函数返回指针变量
返回的指针指向的空间要有使用权限
- 内存分配:
- 栈区:主要是局部变量,自动内存管理
- 代码区:存放二进制代码
- 文字常量区:存放 “abc”;
- 静态全局区:全局变量,静态变量(都是编译期初始化)
- 堆区:程序员手动管理
- 开辟空间
malloc(n) //
在堆区申请n
个字节的连续空间,返回首地址
calloc(n,s) //
在堆区申请n
*s
个字节的连续空间,返回首地址
realloc(address,size)
//
在已有空间的基础上重新申请size
个字节空间
a
、
当size
大于原来的空间时:
重新开辟空间,将原来空间中的数据拷
贝到新空间,并释放原来的空间
b
、当size
小于原来的空间时:
缩小原来的空间到size
大小,原空间
size
大小数据保留
- 释放空间
free(p);//p
为要释放的
堆空间的首地址
注意:只用自己申请的堆空间才能使用
free
malloc
和 free
要成对出现
当malloc
次数 > free
次数
内存泄漏
当malloc
次数 < free
次数
二次删除
- 思考函数不能返回指向局部变量的指针原因?
- 指针与数组
int a[5] = {1,2,3,4,5};
int* p = a;
a
、数组名类似指针,访问数组的方式
:
a[0]
等价于
*p;
a[1]
等价与
*(p+1);
以数组形式访问:
- 传递数组作为函数参数
int func1 (int array[]);
int func1 (int *array);
注意数组名是常量,不可以修改