龙空技术网

C|数组名在不同的上下文中表示指向整个数组或数组首元素的指针

小智雅汇 249

前言:

目前朋友们对“c语言指针数组指向数组的指针”大体比较注重,朋友们都需要剖析一些“c语言指针数组指向数组的指针”的相关内容。那么小编在网摘上搜集了一些有关“c语言指针数组指向数组的指针””的相关内容,希望各位老铁们能喜欢,我们一起来了解一下吧!

数组是数据元素的线性顺序存储,二维数组是数组元素是一维数组的数组,三维数组是数组元素二维数组的数组,n维数组是数组元素是n-1维的数组。

数组名是一个特殊的指针,特殊之处在于其常量性质,以及数组名在不同的上下文中可以指向整个数组或数组的首元素(如果元素是数组或多维数组,则其元素的类型具有一各维长度的信息),移动时会有不同的步长。

为什么要区分在不同的上下文中数组名表示指向数组的首元素的地址呢?这是为了方便元素的访问,表示为首元素的地址时,可以用数组名加减一个整数(步长与元素的字节长度一致)来得到数组元素的地址。需要注意的是,数组的下标写法是指针写法的语法糖。

#include <stdio.h>#define R 3#define C 4int main(){    //数组名在不同的上下文中可以指向整个数组或数组的首元素,移动时会有不同的步长    int up = 111;    int arr[R][C] = {1,2,3,4,5,6,7,8,9,10,11,12};     // 可以通过“分裂原则”和“右左原则”来理解数组    // 其声明是将元素类型和维度分裂在标识符左右两侧    // Java可以声明为int[][] arr = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};    // 对数组声明的理解,从标识符arr开始,先看右边,符号[],表示arr是一个数组,其元素个数是R,    // 继续右边,符号[]表示arr元素还是一个数组,数组的元素个数是C,右边看完看左边,元素类型是int    // 所以,arr是一个元素类型为一维数组int[C]的二维数组,元素个数为R    int down = 999;    int(*pp)[R][C] = &arr;    printf("%p %p %p %p\n",&up,&arr[R-1][C-1],arr,&down);//0012FF44 0012FF40 0012FF14 0012FF10    printf("%p %p %p\n",&up,pp+1,&arr+1);// 0012FF44 0012FF44 0012FF44    printf("%d\n",sizeof arr / sizeof *arr);// 3    // 数组名在与运算符&、sizeof一起使用的上下文中,数组名表示的是指向整个数组的指针    int(*p)[C] = arr;    printf("%p %p %p\n",&arr[1][0],p+1,arr+1); // 0012FF24 0012FF24 0012FF24    // 数组名在其它上下文中(不与运算符&、sizeof一起使用的场合),数组名表示的是指向数组首元素的指针    // 此时,数组名与一个整数的加减表示数组元素的移动。    int i,j;    for(i=0;i<R;i++)        for(j=0;j<C;j++)            printf("%d ",*(*(p+i)+j));// 数组的下标写法p[i][j]是指针写法的语法糖    int *q = &arr[0][0];    printf("\n");    for(i=0;i<R*C;i++)        printf("%d ",*(q+i));    // 一维数组    int ar1[12] = {1,2,3,4,5,6,7,8,9,10,11,12};    int(*pp1)[12] = &ar1;    int *p1 = ar1;    // 三维数组    int ar3[2][3][4] = {1,2,3,4,5,6,7,8,9,10,11,12,                        13,14,15,16,17,18,19,20,21,22,23,24};    // ar3是一个元素类型为二维数组int[3][4]的三维数组,元素个数为2    int (*pp3)[2][3][4] = &ar3;    int (*p3)[3][4] = ar3;    getchar();}/*0012FF44 0012FF40 0012FF14 0012FF100012FF44 0012FF44 0012FF4430012FF24 0012FF24 0012FF241 2 3 4 5 6 7 8 9 10 11 121 2 3 4 5 6 7 8 9 10 11 12*/

-End-

标签: #c语言指针数组指向数组的指针