今天练习指针(初阶)
一 . 指针与指针变量
1. 概念:
每个内存单元都有编号,即地址,由于地址指向一个变量的内存单元,故形象地把地址称作指针,存放地址的变量则称为指针变量。
int a = 10; a占4个字节
int * pa = &a; 拿到的是a四个字节中的第一个字节的地址
*pa = 20; 由指针改变a的值
2. 指针变量的大小
在32位机器中,指针变量占4个字节,因为有32个比特位;64位平台则对应8个字节
因为地址是由地址线产生的,32位机器有32根地址线,因此操作系统可以使用的最大存储空间是2^32,64位同理。
但是注意!整型变量无论在32还是64位平台上都占4个字节
所有类型的指针变量都相同
3.指针类型的意义
(1)指针的类型决定了指针解引用的权限有多大
int类型的能修改4个字节,char能改一个字节,double能改8个字节
(2)指针类型决定了指针走一步能走多远(步长)
int arr[10] = {0};
int * pa = arr;
char * pc = arr;
注意pa 和 pc 显示的地址是相同的,但是pa + 1 和 pc + 1不同
pa + 1 是跳过了4个字节(1个整形),pc+1跳过了1个字节
二 . 野指针
1.概念
指针指向的位置是不可知的(随机的,不正确的,没有明确限制的)
(1)指针未初始化
int * p ; p是一个局部的指针变量,局部变量不初始则默认为随机值
*p = 10; 非法访问内存了
(2)指针越界访问
int arr[10] = {0};
int *p = arr;
*( p + 10 ) = 10; p+10超出了数组范围,属于野指针
(3)指针指向的空间释放
空间释放后,内存不再属于你,而是返还给系统,不能再访问
2 .如何避免野指针
(1)指针初始化
当不知道初始成什么,直接初始空值 | 否则明确知道初始化的值
int * p = NULL; NULL本质上还是0
(2)小心指针越界
(3)指针指向空间释放及时设置NULL
(4)指针使用前检查有效性
指针若是空值,则不能访问,因为NULL(0)不属于用户的空间
三 . 指针运算
1. 指针 +- 整数
int * p =arr;
p++;
2.指针 - 指针
&arr[9] - &arr[0]
前提是两个指针指向同种空间(同一个数组)
结果是两个指针之间的元素个数
3. 指针的关系运算
int * p = arr ;
int * pa = arr + 9;
p <= pa
规定:允许指向数组元素的指针与指向数组最后一个元素之后的一个元素比较,而不允许与数组第一个元素之前的一个元素的指针比较
四.数组中的指针知识
arr <==> &arr[0] <==> p
arr[i] = p[i] =*(p + i )= *(arr + i) =*(i + arr) = i[arr]
五. 二级指针
int a = 10;
int * pa = &a;
int** ppa=&pa; ppa为二级指针,指向pa
解引用 * ppa == pa ** ppa = a
六. 指针数组 -- 存放指针的数组
int* parr[5]; char* parr[5];