不同类型的指针的区别:
- 访问的范围不同,int*的指针访问4个字节,char*的指针访问1个字节,数组的指针除外(*数组指针) == 数组首元素地址;
- +1跳过的跨度不同,会跳过整个访问范围,数组指针+1也跳过整个数组;
一、野指针
野指针:指针指向的位置是不可知的;(随机值、不正确)
//1、指针未初始化
int* p;
//2、指针越界
int arr[10] = {0};
int* p = &arr;
p += 11; // 此时p越界为野指针
//3、指针指向的空间已经被释放
int test()
{
int a = 10;
return &a;
}
二、指针计算
2.1 指针和整数
*(arr + i) == arr[i] == *(i + arr) == i[arr];
2.2 指针和指针
int main()
{
int arr[10] = {0};
printf{"%d ", &arr[9] - &arr[0]}; // 打印结果是:9
printf{"%d ", &arr[0] - &arr[9]; // 打印结果是:-9
return 0;
}
注意:指针和指针相减的前提是两个指针指向同一空间,不然无意义;
2.3 指针关系运算
标准:允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但不允许与指向第一个元素之前的内存位置的指针比较。
#define NUMS 10
int arr[NUMS] = {0};
int* ptr = NULL;
for(ptr = &arr[NUMS-1], ptr >= &arr[0], ptr--)
{
*ptr = ptr;
} // 该代码最后将数组前一个位置内存的指针和&arr[0]做了比较,不符合标准
for(ptr = &arr[NUMS], ptr > &arr[0], )
{
*--ptr = ptr;
} // 此代码符合标准
三、二级指针
int a = 10;
int* ptr1 = &a; // 一级指针
int** ptr2 = &ptr1; // 二级指针:用来存放一级指针变量的地址
**ptr2 = 100; // 此时修改了a的值
char arr1[] = "aaaa";
char arr2[] = "bbbb";
char arr3[] = "cccc";
char* ptr[] = {arr1, arr2, arr3}; // 指针数组
char**ptr2 = ptr; // 二级指针
// 访问
// ptr[1][2] == arr2[2] == 'b';