1.指针是什么?
- 指针是内存中一个最小单元的编号,也就是地址
- 平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量
所以,指针就是地址,口语中说的指针通常指的是指针变量。
1.指针变量
-
我们可以通过&(取地址操作符)取出变量的内存其实地址,把地址可以存放到一个变量中,这个变量就是指针变量
-
指针变量是用来存放地址的变量,地址是唯一标示一个内存单元的。
-
指针的大小在32位(x86)平台是4个字节,在64位(x64)平台是8个字节。
2. 指针和指针类型
指针的定义方式是:type + *
(type就是数据类型)
1.指针±整数
指针的类型决定了指针向前或者向后走一步有多大(距离)
2.指针的解引用
- 指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。
比如: char* 的指针解引用就只能访问一个字节,而 int* 的指针的解引用就能访问四个字节。
3.野指针
1. 野指针成因:指针未初始化
- 局部变量指针未初始化,默认为随机值
- 指针越界访问
#include <stdio.h>
int main()
{
int arr[10] = {0};
int *p = arr;
int i = 0;
for(i=0; i<=11; i++)
{
//当指针指向的范围超出数组arr的范围时,p就是野指针
*(p++) = i;
}
return 0;
}
2 如何规避野指针
- 指针初始化
- 小心指针越界
- 指针指向空间释放,及时置NULL(本质就是0,用来初始化指针)
- 动态内存分配
(1)申请
int*p = malloc(40)
(2)使用
(3)释放
free`(p)`
p= NULL
- 避免返回局部变量的地址
- 指针使用之前检查有效性
4.指针运算
4.1 指针± 整数
- 允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与
- 指向第一个元素之前的那个内存位置的指针进行比较。
4.2指针-指针(两个指针之间的元素个数)
- 前提是指针指向的同一块连续的空间
- 不存在指针+指针
4.3指针的关系运算
允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与
指向第一个元素之前的那个内存位置的指针进行比较。
5.数组和指针
- 数组和指针不是一个东西
- 数组能存放一组数,连续的空间,数组的大小取决于元素的个数
- 指针是一个变量,是存放地址的,4个字节或者8个字节
- 联系:数组名是地址(指针)
数组把首元素的地址,交给一个指针变量后
可以通过指针访问数组
6.二级指针
一般常用的就是一级,二级指针,三级四级甚至更高等级的指针(你见过谁闲的没事存指针一个放在一个里,还放好几层)