目录
本文章将对指针进行泛讲
一,初识指针
什么是指针
1.指针是内存中一个最小单元的编号,也就是地址
2.平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量
总结:指针就是地址,口语中说的指针通常指的是指针变量
图中十六进制的数字就代表地址值
32位虚拟空间:CPU- 32位地址(32bit) - 地址线传输 -> 内存
64位虚拟空间:CPU- 64位地址(64bit) - 地址线传输 -> 内存
指针变量
定义:可以通过 & (取地址操作符) 取出变量的内存起始地址,把地址可以存放到一个变量当中,这个变量就是指针变量
32位:
00000000000000000000000000000001
00000000000000000000000000000010
00000000000000000000000000000011
......
一共有2的32次方种可能
1KB=1024 byte
1MB=1024 KB
1GB=1024 MB
32位->4GB
二, 指针类型
以下举例 char和int 指针类型
指针类型决定了,指针在被解引用的时候,访问的权限。
整型 指针解引用访问 4 个字节 ;字符 指针解引用访问 1 个字节
假如你希望,访问每一个字节:
如果希望按照一个整型的形式访问:
三,野指针
野指针就是指,指针指向的位置是不可知的(随机的,不正确的,没明确限制的)
1.野指针的成因
1.1指针未初始化
1.2指针越界访问
1.3指针指向的空间释放
2.如何规避野指针
1.指针初始化 2.小心指针越界 3.指针指向空间释放即使置NULL 4.避免返回局部变量的地址
5.指针使用之前检查的有效性
四,指针运算
1指针+-整数
2.指针 - 指针
指针 - 指针 前提:指针-指针,两个指针必须指向同一块空间
// 出错误写法
int arr[10];
int xaa[10];
printf("%d",arr[10]- xaa[10]);
| 指针 - 指针 | (绝对值)得到的是指针和指针之间元素的个数
3.指针的关系运算
实际在绝大部分的编译器上是可以顺利完成任务的,然而我们还是应该避免这样写,因为标准并不保证但它可行。
标准规定:
允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较。
五,指针和数组
数组和指针不是一回事 , 数组是一块连续的空间 指针是存放地址的变量 可以通过指针来访问数组
数组名是数组首元素的地址
但是有2个例外:
1. sizeof (数组名)数组名表示整个数组,计算的是整个数组的大小
1. &数组名,数组名表示整个数组,取出的是整个数组的地址
数组是连续存放的,故只需要找到首元素地址值便可访问后续数组值:
六,二级指针
七,指针数组
指针数组指的是指针还是数组?
答:指的是数组。是存放指针的数组
数组我们已经知道整型数组,字符数组
int arr1[5]
char arr2[6]
指针数组->存放指针的数组