• C 再识数组指针 指针数组的概念


    参考出处:

    http://www.cnblogs.com/mq0036/p/3382732.html

    http://www.cnblogs.com/hongcha717/archive/2010/10/24/1859780.html

    出处中判断哪个是数组指针和指针数组?

    A int*p1[10] B int(*p2)[10]

    首先看看他们的类型,在 VS C++中使用sizeof运算符。

    printf("%d ",sizeof(p1));  //结果 40  可以看出是一个数组,每一个元素是一个指针,共有10个指针,所以是指针数组,重点在数组上
    printf("%d ",sizeof(p2)); // 结果 4   可以看出是一个指针,指向的是一个数组。

    出处中提出了怎样判断的观点:通过优先符判断,对于 int*p[10]    []优先符高,说明是一个数组,每个元素是 int* 类型的指针;对于Int(*p)[10] 优先符()最高,说明是一个指针,指向的是一个整型的一维数组。

    然后我们看看如何使用它们获得2维数组的元素值:

    int a[2][10] = {{1,1,1,1,1,1,1,1,1,1},{2,2,2,2,2,2,2,2,2,2}};

    p1 = a?

    p2 = a?

    大家都知道 a是一个指向指针的指针常量,a代表整个二维数组的首地址的地址常量,a等价于&a[0] ,是第一个元素的地址,所以指针p2赋值&a[0]是正确的。因为类型相当: 前一种写法不对,后一种对。

    那么p1如何赋值呢? 因为p1是指针数组,正确写法是 p1 = a[0]  p1=a[1] ...

    完整代码如下:

    printf("------");
    int *p1[10];
    printf("%d ",sizeof(p1));
    int (*p2)[10];
    printf("%d ",sizeof(p2));

    int a[2][10] = {{1,1,1,1,1,1,1,1,1,1},{2,2,2,2,2,2,2,2,2,2}};

    printf("---指针数组的使用--- ");
    for (int i=0;i<2;i++)
    {
    p1[i] = a[i];
    for (int j=0;j<10;j++)
    {
    printf("%d ",p1[i][j]);
    }

    printf("指针数组每一行的首地址:p1[i] =  %d  a[i] = %d",p1[i],&a[i]);//1 1 1 1 1 1 1 1 1 1 指针数组每一行的首地址:p1[i] = 13041008 a[i] = 13041008   2 2 2 2 2 2 2 2 2 2 指针数组每一行的首地址:p1[i] = 13041048 a[i] = 13041048


    printf(" ");
    }


    printf("---数组指针的使用--- ");
    p2 = a; //写法最简单
    for (int i = 0;i<2;i++)
    {

    for (int j=0;j<10;j++)
    {
    printf("%d ",p2[0][j]);
    }

    printf("指针数组每一行的首地址:p2[i] =  %d  a[i] = %d",p2,&a[i]); //结果和上面对应的一样,这也是这两者的区别
    p2++; //如果这地方写 p2++说明是指向下一行的指针 那么访问的时候直接使用 p2[0][j] 向该行逐个移动指针
    printf(" ");

    }

    printf("%d ",a);
    printf("%d ",&a);
    printf("%d ",&a[0]); 他们三个值是一样的,说明是数组首元素的地址

    附int**的使用


    int **p = new int *;
    int ar1[10]={1,2,3,4,5,6,7,8,910};
    p[0] = ar1;//p[0]代表的是int*类型
    int ar2[3]={1,2,3};
    p[1] = ar2;
    int * pm = p[1];
    printf("%d",pm[2]);
    std::cout<<pm[2];

  • 相关阅读:
    C/C++中的堆、栈和队列
    网卡工作状态检测
    Delphi 2007 的midas程序注册问题
    使用SQL语句备份与恢复数据库
    C/C++中的堆、栈和队列
    Delphi 2007 的midas程序注册问题
    如何使用VirtualBox的共享文件夹(转)
    如何使用VirtualBox的共享文件夹(转)
    C语言struct的使用
    printf常用格式
  • 原文地址:https://www.cnblogs.com/ShalenChe/p/5382168.html
Copyright © 2020-2023  润新知