• C++指针解读(8) -- 指针数组和二重指针


    1、什么是指针数组

    一个数组,如果其元素都是指针类型的数据,那么这个数组就称为指针数组。指针数组的定义如下:

    int *p[5];

    从右往左读,先是p[5],表示是一个含5个元素的数组;然后是int *,表示这5个元素的数据类型是int *。

    有几个概念我们要区分下:

    (1)指针数组:本质是一个数组,该数组中的每个元素都是一个指针。

    (2)数组指针:本质是一个指针,指向了一个数组。

    比如,int (*p)[5],这种写法表示一个指向含5个元素的数组的指针。

    从右往左读,先是(*p)[5],表示指针p指向了这个数组;int表示这个数组里的元素是int型。

    (3)数组名称:数组名称表示数组元素首地址,是个指针常量。

    比如,int arr[5],则arr表示数组元素首地址,arr + 1表示第2个元素的地址。

    下面我们看1个指针数组的例子:

    1. const char* argv[] = {"a1", "b2", "c3"};
    2. for (int i = 0; i < 3; i++) {
    3. printf(" %s\n", argv[i]);
    4. }

    数组argv[],其中的数据元素是指向字符串常量:a1, b2, c3的指针。这里要特别注意:char *p = "abc"; 是把字符串常量"abc"的首地址赋给了字符变量p。所以argv[]里保存的是字符串常量的指针,而不是字符串自身的值。

    2、二重指针

    二重指针,也就是指针的指针,实际上就是存放指针的地址。

    用代码演示就是这样的:

    1. int a = 10;
    2. int *p = &a;
    3. int **pp = &p;

    二重指针的含义:

    表达式

    相当的表达式

    pp

    &p 即指针p的地址

    *pp

    p, &a 即指针p,也就是对象a的地址

    **pp

    *p, a 即对象a

    二重指针在函数传指针参数时非常有用。因为函数的参数传的是指针的拷贝,而不是指针只身。所以当需要在

    函数内部修改原指针时,就需要传二重指针。

    例子:

    1. void swapPointer(int** p1, int** p2) {
    2. int* tmp;
    3. tmp = *p1;
    4. *p1 = *p2;
    5. *p2 = tmp;
    6. }
    7. int main()
    8. {
    9. int a1 = 10;
    10. int a2 = 15;
    11. int* p1 = &a1;
    12. int* p2 = &a2;
    13. printf(" p1 = %p, *p1 = %d\n", p1, *p1);
    14. printf(" p2 = %p, *p2 = %d\n", p2, *p2);
    15. swapPointer(&p1, &p2);
    16. printf(" p1 = %p, *p1 = %d\n", p1, *p1);
    17. printf(" p2 = %p, *p2 = %d\n", p2, *p2);
    18. return 0;
    19. }

    其实,前面例子的:

    const char* argv[] = {"a1", "b2", "c3"};

    可以把argv看成是一个二重指针。这个指针数组的存储结构可以用下图来表示:

    数组的首地址是argv,argv指向的值是argv[0],argv[0]的值是指向字符串常量"a1"的指针。

    用代码演示如下:

    1. const char* argv[] = { "a1", "b2", "c3" };
    2. const char** pp = argv;
    3. for (int i = 0; i < 3; i++) {
    4. printf(" %s\n", *(pp + i));
    5. }

  • 相关阅读:
    Linux Vi编辑器基础操作指南
    基于Java+SpringBoot+Vue前后端分离游戏交易系统设计和实现
    第4/100天 阅读笔记
    软件明明通过了各种级别的测试,交付给用户仍会出现问题?
    线程间通信
    MATLAB基础应用精讲-【基础知识篇】MATLAB程序优化-通过tic函数和toc函数进行程序运行分析
    测试人生 | 从功能到外企测开,工作1年半拿下年薪30万的测开 offer,这个95后小姐姐未来可期~
    【Bluetooth|蓝牙开发】二、蓝牙开发入门
    vue 第三方组件按需引入,最后项目的包体积真的变小了吗?
    Servlet学习之Filter
  • 原文地址:https://blog.csdn.net/mars21/article/details/133858194