• 指针数组和数组指针的区别


    参考:指针数组和数组指针的区别 关于C语言行指针的详细解析

    指针数组:array of pointers,即用于存储指针的数组,也就是数组元素都是指针

    数组指针:a pointer to an array,即指向数组的指针

    还要注意的是他们用法的区别,下面举例说明。

    int* a[4]     指针数组     

                     表示:数组a中的元素都为int型指针    

                     int型元素表示:*a[i] (a[i]表示int型元素的地址)  *(a[i])是一样的,因为[]优先级高于*

    int (*a)[4]   数组指针                          ----------另一中理解方式:int (*)[4] a;

                     表示:指向int型数组a的指针

                     int型元素表示:(*a)[i]  

    注意:在实际应用中,对于指针数组,我们经常这样使用:

    1 #include "stdafx.h"
    2 
    3 typedef int* pInt;
    4 pInt a[4];
    5 
    6 int _tmain(int argc, _TCHAR* argv[])
    7 {
    8     return 0;
    9 }

    这跟上面指针数组定义所表达的意思是一样的,只不过采取了类型变换。

    数组指针代码如下:

     1 #include "stdafx.h"
     2 
     3 
     4 int _tmain(int argc, _TCHAR* argv[])
     5 {
     6     int array[3] = {1,2,3};
     7 
     8     //指针数组:array of pointers,即用于存储指针的数组,也就是数组元素都是指针
     9     typedef int* pInt;
    10     pInt pIntArray[3] = {&array[0], &array[1], &array[2]}; 
    11 
    12     for(int i = 0; i < 3; ++i)
    13         printf("%d
    ", array[i]);
    14 
    15     printf("
    ");
    16 
    17     for(int i = 0; i < 3; ++i)
    18         printf("%p %d
    ", pIntArray[i], *pIntArray[i]);
    19 
    20     printf("数组指针
    ");
    21 
    22     //数组指针:a pointer to an array,即指向数组的指针
    23     int (*arrayPointer)[3];
    24 
    25     arrayPointer = &array; //arrayPointer = array; 
    26                            //error C2440: '=' : cannot convert from 'int [3]' to 'int (*)[3]'
    27                            //arrayPointer类型是int (*)[3],array类型是int [3]
    28 
    29     for(int i = 0;i < 3;++i)
    30         printf("%d
    ", (*arrayPointer)[i]); //arrayPointer = &array; *arrayPointer即逆向引用等同于array
    31 
    32     printf("通过二维数组理解数组指针
    ");
    33 
    34     //通过二维数组理解数组指针
    35     int array2D[2][3] = {{11,12,13},
    36                          {24,25,26} }; //定义的array2D[2][3]的二维数组,可以把它当2个一维数组来看待。即:
    37                                        //array2D[0]={11,12,13}
    38                                        //array2D[1]={24,25,26}
    39     for(int i = 0;i < 2;++i)
    40     {
    41         for(int j = 0;j < 3;++j)
    42             printf("%d ", array2D[i][j]);
    43         printf("
    ");
    44     }
    45 
    46     printf("行指针即为数组指针
    ");
    47 
    48     //行指针即为数组指针(行指针:指向一行的指针,即二维数组中的某一行)
    49     int (*rowPointer)[3];
    50     rowPointer = &array2D[0]; //rowPointer = array2D[0];(rowPointer = array2D √:array2D即为&array2D[0])
    51                               //error C2440: '=' : cannot convert from 'int [3]' to 'int (*)[3]'
    52                               //rowPointer类型是int (*)[3],array2D[0]类型是int [3]
    53 
    54     printf("%p %p
    ", &array2D[0], &array2D[0][0]); //array2D[0]和array2D[0][0]地址相同却意义不同:
    55                                                     //array2D[0]类型是int [3], array2D[0][0]类型是 int
    56                                                     //计算机中的字节就是一堆010101.....
    57                                                     //用什么类型的变量解释这堆数据,
    58                                                     //得到的就是对应类型的数据(类型强转基于此)
    59     printf("通过行指针取出元素方式一
    ");
    60 
    61     for(int i = 0;i < 2;++i)
    62     {
    63         for(int j = 0;j < 3;++j)
    64             printf("%d ", (*(rowPointer + 1))[j]);
    65         printf("
    ");
    66     }
    67 
    68     printf("通过行指针取出元素方式二
    ");
    69 
    70     for(int i = 0;i < 2;++i)
    71     {
    72         for(int j = 0;j < 3;++j)
    73             printf("%d ", (*(rowPointer))[j]);
    74         rowPointer++; //行指针移动到下一行,移动n个地址位,n为一行的元素个数x元素的字节大小
    75         printf("
    ");
    76     }
    77 
    78     getchar();
    79     return 0;
    80 }

    结果:

    数组与指针的艺术--深入探索c/c++数组与指针的奥秘 

  • 相关阅读:
    【java虚拟机】垃圾回收机制详解
    【java虚拟机】分代垃圾回收策略的基础概念
    【java虚拟机】内存分配与回收策略
    【java虚拟机】jvm内存模型
    【转】新说Mysql事务隔离级别
    【转】互联网项目中mysql应该选什么事务隔离级别
    有关PHP的字符串知识
    php的查询数据
    php练习题:投票
    php的数据访问
  • 原文地址:https://www.cnblogs.com/kira2will/p/4099290.html
Copyright © 2020-2023  润新知