二级指针

概念:存放一级指针地址的指针

#include<stdio.h>
int main()
{
    int n = 1;
    int *p1 = &n;//对n取地址 赋值给point指针变量
    int **p2 = &p1;//对point取地址 把存放point指针的地址赋值给pointp二级指针
}

指针数组

指针类型的数组

#include<stdio.h>
int main()
{
    int *p[3];
    int arr0[3] = {};
    int arr1[3] = {};
    int arr2[3] = {};
    p[0] = arr0;
    p[1] = arr1;
    p[2] = arr2;
}

则指针数组和int数组的关系为
p[0]存放的地址为arr0的地址
p[1]存放的地址为arr2的地址
p[2]存放的地址为arr3的地址

赋值方法

p[0] = arr0;
p[0] = &arr0[0];

原理为arr0表示的即为数组第一元素的地址

指针数组元素交换

指针数组放置后 可交换其内部元素

void arr_swap(char **p1,char **p2)
{
    char *temp = *p1;
    *p1 = *p2;
    *p2 = temp;
}

arr_swap函数使用二级指针 创建保存地址的p1指针 利用临时指针temp 获取p1指针内保存的指针地址 随后将指针p2内保存的地址赋值给p1 再将p2指针指向temp 即为原p1指针存放的地址
最后结果中 p1 p2交换了对方指针内存放的指针地址 完成了交换

为什么要使用二级指针交换呢?

void point_swap(char *p1,char *p2)
{
    char *temp = p1;
    p1 = p2;
    p2 = temp;
}

以上代码中 point_swap函数 对p1 p2指针的值直接进行了交换 但是作用域不同 指针传入后 在函数内进行了交换 但作用域仅仅在point_swap函数内部生效 只是将函数值传入 并未再次传出 简单而言 就是仅仅将000000000061FA20这类指针地址字符进行了交换 是变量的值在进行交换 并非变量进行交换 而如果将二级指针传入 传入了存储地址的指针 那么再对该地址取值 进行交换 那么是通过寻址在读写这个地址里面的东西 作用域在整个计算机内 这样的修改 在全局生效 因此可用

最后修改:2022 年 12 月 01 日
如果觉得我的文章对你有用,只需评论或转发支持,谢绝投喂!