1、指针:用来存放地址的,地址是唯一标识一块地址空间的
2.1、意义:指针的类型决定了指针进行解引用操作时,访问空间的大小
int*---访问4个字节
char*---访问1个字节
double*---访问8个字节
int a = 0x11223344
int* pa = &a ;
*pa = 0;-----此时的a为0x00000000
char* pc = &a ;
*pc = 0 ;------此时的a为0x 11223300(小端存储)
2.2、意义:指针类型决定了:指针的步长,走一步会走多远
int* pa ;----pa+1地址加4
char* pc ;---- pc+1地址加1
3、意义的价值:
int* pa = arr;-----pa+1指向第二个元素位置
int* ppa = &arr;-----ppa+1指向了跳过整个数组的位置
4、指针变量p
指向元素:int* p = &a ;指向元素地址
指向数组:int* p = &arr ;指向数组首元素地址
int* p = &arr[9];指向数组第十个元素地址
5、指针的运算
pa+?(整数):pa向前或先后走该类型个字节,但要避免越界
pa-pb:等价于&arr[9]-&arr[0],所得结果为9,不论是什么类型的数组,但不要用不同数组的地址去运算,会是未知数
pa>pb:是可以运用关系运算符的
6、允许指针与数组arr[MAXSIZE]之后的地址作比较,不允许与arr[0]之前的地址作比较
for( pa = &arr[MAXSIZE] ; pa>arr ; pa--)-----推荐
for( pa = &arr ; pa<arr[MAXSIZE] ; pa++)----不推荐
7、野指针:指针指向位置是不可知的
危害:
指针未初始化,地址是随机的int* pa;
指针越界访问,int* pa = arr;,但arr有十个元素,pa指向了"第十一个"元素
指针指向空间被释放:(在vs2022中好像并不会出错,按理说在调用结束后a会被销毁,此时a处的地址并不会存放着a的值)
避免野指针的产生:
指针初始化:int* pa = NULL;不知道存放什么的时候,存放空指针
小心指针越界访问,一般会直接程序崩溃
指针指向空间被释放时将指针设为NULL(pa = NULL)
指针在使用之前检查有效性,在pa = NULL;时,*pa会直接报错(可以在使用前用if判断下指针是否为空指针)
8、多级指针
一级:int* pa = &a; *pa == a;(解引用)
二级:int** ppa = &pa; **ppa == a;
三级:int*** pppa = &ppa; ***pppa == a;
.....(多级指针)
9、指针数组:是数组
int* arr[3] = {&a , &b , &c};
int* arr[3] = {pa , pb , pc};(用来存放指针的数组)
(打印)----*(arr[i])
10、数组指针:是指针
标签:arr,int,地址,pa,数组,指针 From: https://blog.51cto.com/u_13606048/6155262