• 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];

  • 相关阅读:
    V-Box
    One CLI for webpack must be installed. These are recommended choices, delivered as separate packages:
    获取用户地理位置
    错误 CS0234 命名空间“Microsoft”中不存在类型或命名空间名“Reporting”(是否缺少程序集引用?)
    “/Reports”应用程序中的服务器错误。
    微信公众号关注界面的菜单栏跟实际的菜单栏不一致
    错误 CS8107 C# 7.0 中不支持功能“xxxxxx”。请使用 7.1 或更高的语言版本。
    已经安装了 AccessDatabaseEngine.exe,还是报错
    没有足够的内存继续执行程序(mscorlib)
    坑,坑,
  • 原文地址:https://www.cnblogs.com/ShalenChe/p/5382168.html
Copyright © 2020-2023  润新知