JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

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

wys521 2024-11-16 01:45:25 精选教程 28 ℃ 0 评论

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

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

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

#include <stdio.h>
#define R 3
#define C 4
int 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 0012FF10
0012FF44 0012FF44 0012FF44
3
0012FF24 0012FF24 0012FF24
1 2 3 4 5 6 7 8 9 10 11 12
1 2 3 4 5 6 7 8 9 10 11 12
*/

-End-

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表