初级指针
1.int* p=&a//p就是一个指针变量
指针就是一个变量,是用来存放地址的变量(存放在指针中的值都被当作地址来使用)。
2.指针的大小,在32位平台上是4个字节,在64位平台上是8个字节。
3.指针类型的意义
①决定了指针进行解引用的时候能够访问空间的大小
例如:int* p; //表示*p能够访问四个字节。
char* p//表示能够访问一个字节。
double* p//能够访问八个字节。
②在指针+数字中的情况不同
指针类型决定了指针走一步能够走过多少空间(步长)。
例如:int* p; p+1表示走过了四个字节,以此类推。
4.野指针
1)什么是野指针?
访问一个已销毁或者访问受限的内存区域的指针,不能根据其是否为NULL来判断其一个指针是不是野指针。
2)野指针产生的原因
①指针不初始化
②指针越界访问:如在数组中访问超过数组大小的空间
③指针指向空间释放:调用函数时进入函数,局部变量建立,退出所调用的函数,在改函数范围内的局部变量销毁,所申请的空间还给系统,这就使得主函数指向该空间的指针变成了野指针。
3)如何规避野指针
①初始化指针
②小心指针越界
③指针指向空间释放后即将其置为NULL
④指针使用前检查其有效性
5.指针+/-整数
即指针越过或回退多少个指针类型的空间
6.指针 - 指针:得到的是中间元素的个数
应用,用指针求字符串长度
int my_strlen(char *c) { char* p = c; while (*p != '\0') { p++; } return p - c; }
规定表明:允许指向数组元素的指针可以与指向数组最后一个元素的后面的那一个内存位置的指针进行比较,而不可以与指向第一个元素之前的那个内存位置的指针进行比较。
7.指针和数组
1)数组名是首元素的地址。
两个例外情况
int arr[] = {0};
int* p= arr;
①&arr-&数组名-数组名表示整个数组的地址。
②在使用sizeof(arr)+1的时候,跳过的空间为整个数组的存储空间。
2)指针与数组的联系
p+i == &arr[i];//p指向的是第一个元素的地址,+i表示跳过了i个元素数组类型所占的空间。
*(p+i)== arr[i];//不难理解对p+i进行解引用就是数组arr[i]的元素值。
8.二级指针
int a =10;
int* pa = &a;
int** ppa = &p;
ppa就是一个二级指针变量,他指向的是一级指针pa所在的地址。
**ppa == *pa == a。