指针
什么是指针?
•指针就是地址,口语中说的指针通常指的是指针变量
•32位虚拟地址空间
CPU-32位地址-地址线传输-内存
指针变量
我们可以通过&(取地址操作符)取出变量的内存其实地址,把地址可以存放到一个变量中,这个变量就是指针变量
例: int a =10;
Int *pa=&a;
Pa是一个变量
专门用来存放地址的
这个变量就被称为:指针变量
•在32位的机器上,地址是32个0或者1,组成二进制序列,那地址就得用4个字节的空间来存储,所以一个指针变量的大小就应该是4个字节。
•那如果在64位机器上,如果有64个地址线,那一个指针变量的大小是8个字节,才能存放一个地址。
总结,
指针是用来存放地址的,地址是唯一标示一块地址空间的
指针的大小在32位平台是4个字节,在64位平台是8个字节
指针和指针类型
•指针类型决定了,指针再被解引用的时候,访问的权限
•整型指针解引用访问4个字节
•字符指针解引用范文1个字节
•指针类型决定了,指针向前或向后走一步,走多大距离
指针的解引用
•指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)
•比如:char* 的指针解引用就只能访问一个字节,而int * 的指针的解引用就能访问四个字节
•不管是二维还是一维数组,在传参的时候,都不会去创建数组,所以数组的大小不需要明确指定
•一维数组传参的时候,形参的数组大小可以省略
•二维数组传参的时候,形参的数组中,行可以省略,列不能省略。
野指针
•野指针就是指针指向的位置是不可知的(随机的,不正确的,没有明确限制的)
野指针成因
•指针未初始化
•指针越界访问
•指针指向的空间释放
如何规避野指针
•指针初始化
•小心指针越界
•指针指向空间释放即使置NULL
•避免返回局部变量的地址
•指针使用之前检查有效性
指针运算
•指针+-整数
•指针——指针(前提是,两个指针必须指向同一块空间)
•得到的指针和指针之间元素的个数
指针的关系运算
•允许指向数组元素的指针与指向数组最后一个元素后面那个内存位置的指针比较,但是不允许与指向第一个元素之前那个内训位置的指针进行比较
指针和数组
•数组名是数组首元素的地址
•但是有两个例外:
•Sizeof(数组名),数组名表示整个数组,计算的是整个数组的大小
•&数组名,数组名表示整个数组,取出的是整个数组的地址
•数组是一块连续的空间
•指针是存放地址的变量
•可以通过指针来访问数组
二级指针
指针数组——存放指针的数组
•Int *arr[5] 是指针数组
指针数组是指针还是数组?
答案:是数组。存放指针的数组
数组我们已经知道整型数组,字符数组