C语言学习笔记——指针:指针与二维数组

在C语言中可将一个二维数组看成是由若干一维数组构成的。如:

int a[3][4];

首先,可将二维数组a看成是由a[0],a[1],a[2]三个元素组成的一维数组,a是该一维数组的数组名,代表该一维数组的首地址,即第一个元素a[0]的地址(&a[0])。所以*(a+i)即为a[i],注意这里所谓的元素a[0],a[1],a[2]事实上仍然是个地址。
C语言学习笔记——指针:指针与二维数组_第1张图片
其次,可以将a[0],a[1],a[2]分别看成是由4个int型元素组成的一维数组元素的数组名,如a[0]就可以看成由元素a[0][0]a[0][1]a[0][2]a[0][3],这4个整型元素组成的一维数组。a[0]就是这个一维数组的数组名,它代表该一维数组的首地址,即第一个元素a[0][0]的地址(&a[0][0]),则a[0]+i表示a[0][i的地址(&a[0][i])。因此*(a[0]+i)即为a[0][i。同时,a[i]即*(a+i)可以看成一维数组a的下标为i的元素。根据以上分析可知a[i]+j及*(a+i)+j代表这个数组中下标为j的元素地址,即&a[i][j]*(a[i]+j)*(*(a+i)+j)就代表这个地址所指向的元素的值,即a[i][j]。因此,以下4种表示元素a[i][j]的形式是等价的:
a[i][j]
*(a[i]+j)
*(*(a+i)+j)
(*(a+i))[j]
行指针:使用二维数组的行地址进行初始化。
一般格式:类型关键字 (*行指针名)[常量N];
其中,常量N定义行指针所指一维数组的长度。
通过行指针p引用二维数组的方法可以有以下4种形式:
p[i][j]
*(p[i]+j)
*(*(p+i)+j)
(*(p+i))[j]
例如:

# include 
int main(void)
{
    int a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
    int i, j;
    int (*p)[4] = a;  //行指针初始化格式
    for (i=0; i<3; ++i)
    {
        for (j=0; j<4; ++j)
        {
            printf("%-2d\x20", *(*(p+i)+j));  
        }
        printf("\n");
    }
    return 0;
}

输出结果:
1 2 3 4
5 6 7 8
9 10 11 12
列指针:使用二维数组的列地址进行初始化。
定义列指针p后,为了能通过p引用二维数组元素a[i][j],可将数组a看成一个由m行*n列个元素组成的一维数组。因此,p+i*n+j代表数组的第i行第j列的地址,即&a[i][j],于是,通过列指针p引用二维数组a[i][j]的方法可以有以下两种形式:
*(p+i*n+j)
p[i*n+j]
例如:

# include 
int main(void)
{
    int a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
    int i, j;
    int *p = &a[0][0];  //列指针初始化格式,把a[0][0]的地址赋给指针变量p
    for (i=0; i<3; ++i)
    {
        for (j=0; j<4; ++j)
        {
            printf("%-2d\x20", *(p+i*4+j));
        }
        printf("\n");
    }
    return 0;
}

输出结果:
1 2 3 4
5 6 7 8
9 10 11 12

参考文献:C语言大学实用教程

你可能感兴趣的:(C/C++)