龙空技术网

C|数形结合理解数组指针、指针数组、一级指针来遍历二维数组

小智雅汇 198

前言:

而今同学们对“数组排序c语言数组”大致比较重视,各位老铁们都需要知道一些“数组排序c语言数组”的相关内容。那么小编同时在网络上汇集了一些对于“数组排序c语言数组””的相关内容,希望咱们能喜欢,我们快快来了解一下吧!

二维数组本质是也是线性存储的一维数组,各元素都是相对于基地址(首地址)的偏移,只是逻辑上的维度区分而已。或者可以理解为数组的数组,也就是说,n维数组的元素是一个n-1维数组。

需要注意的是,多维数组名与多维指针任何时候都不等价(除了一级指针可以直接用一维数组名赋值),但是,因为n维数组的元素是一个n-1维数组的关系。多维数组可以降维来处理,一个n维数组通过一个n-1维数组指针或指针数组(其元素的指针指向一个n-1维数组)或一级指针来处理。

1 二维数组与指针数组

二维数组在内存中是按照行优先的方式顺序存放的,所以二维数组我们可以理解为一维指针数组,每个指针元素分别指向二维数组的一行,这个一维指针数组的元素个数就是二维数组的行数:

int arr[ROW][COL];int* pa[ROW];for(i=0;i<ROW; i++)    pa[i] = arr[i];
2 二维数组与数组指针

在C中,n维数组名与n-1维数组指针等价,因为n维数组可以理解为n维数组的元素是一个n-1维的数组,且C中对多维数组是以行存储的,所以n维数组名可以直接赋值给一个n-1维数组指针:

 int arr[3][4]; int (*ap)[4]=arr;

这里arr是个二维数组的数组名,相当于一个二级指针常量,但二维数组名并不能赋值给二级指针,两者并不等价。

ap是一个指针变量,它指向包含4个int元素的一维数组,此时ap的增量以它所指向的一维数组长度为单位;

*(ap+i)是一维数组arr[i][0]的地址,也就是二维数组第i行的首地址。

*(ap+2)+3表示arr[2][3]地址(第一行为0行,第一列为0列),*(*(ap+2)+3)表示arr[2][3]的值。

//(*ap)[4]其中的5换成其他的数字在vc++6.0环境中都无法通过编译

以下写法等价:

arr[i][j]ap[i][j]*(*(arr+i)+j)*(*(ap+i)+j)
3 二维数组与一级指针

二维数组本质上线性存储的,而数组名指向了这块内存单元的首地址,如果用一个一级指针指向它,通过地址偏移便可以访问二维数组的全部元素:

 int arr[3][4];int* p = (int*)arr;p = &arr[0][0];  // 也可以直接指向其首元素

所以,二维数组可以通过一个数组指针、指针数组、一级指针来遍历:

源代码:

#include <iostream>using namespace std;#define ROW 3#define COL 4int main(){    // 1 指针与数组    int ar[ROW],var;    // 数组名是一块内存的首地址    //ar = &var;        // 数组名是个常量,不能继续用做左值    int* arp = ar;       // 指针变量名有己址、己值,也有他址、他值、他型    arp= &var;          // 指针变量可随时用做左值        printf("%d,%d\n",sizeof(ar),sizeof(arp));    int arr[ROW][COL];    int i,j;    for(i=0; i<ROW; i++)        for(j=0; j<COL; j++)            arr[i][j] = i+j;    // 2 指针变量名+1的理解    printf("%p\n",arr);    // 0012FF04    printf("%p\n",arr+1);  // 0012FF14, arr+1地址偏移ROW*sizeof(int)    printf("%p\n",&arr+1); // 0012FF34,&arr+1地址偏移ROW*COL*sizeof(int)    // 3 二维数组是数组的数组,一个数组指针可以指向一个数组,指向数组的一行    int (*ap) [COL] = arr; // ap指向一个int[COL]的数组    printf("%p\n",ap);     // 0012FF04    printf("%p\n",ap+1);   // 0012FF14,  ap+1地址偏移ROW*sizeof(int)    for(i=0; i<ROW; i++)    {        for(j=0; j<COL; j++)            printf("%d ",*(*(ap+i)+j));        printf("\n");    }        // 4 指针数组中的指针可以指向数组的某行    int* pa[ROW];    for(i=0;i<ROW; i++)        pa[i] = arr[i];    printf("%p\n",pa[0]);     // 0012FF04    printf("%p\n",pa[1]);     // 0012FF14,pa[1]是第二行的首地址    printf("%p\n",pa[0]+1);   // 0012FF08,pa[0]+1地址偏移sizeof(int)    for(i=0; i<ROW; i++)    {        for(j=0; j<COL; j++)            printf("%d ",*(pa[i]+j));        printf("\n");    }    // 5 指针变量指向数组的首地址    int* p = (int*)arr;    for(i=0; i<ROW; i++)    {        for(j=0; j<COL; j++)            printf("%d ",*(p+i*ROW+j));        printf("\n");    }    while(1);    return 0;}/*12,40012FF040012FF140012FF340012FF040012FF140 1 2 31 2 3 42 3 4 50012FF040012FF140012FF080 1 2 31 2 3 42 3 4 50 1 2 33 1 2 33 4 2 3*/

-End-

标签: #数组排序c语言数组