二维数组的指针,某一行的指针,某一元素的指针各代表什么含义?

如题所述

int a[5][6];

int (*p)[6]=a;

int * p1= a[0];

int * p2= &a[0][0];

首先,数组首地址值=行首地址值=第一个元素地址值,注意只是值相等,重要的是类型不同.记住:地址类型很重要.

1)int (*)[n]

数组地址类型,其中n为列宽,表示一行中包含n个int元素,此处为6,即6个int元素组成一行,并将其看成一个整体,int的数据宽度是4字节,因此一行(整体)有4*6=24个字节.此类指针每次递增1即递增24个字节

指针值都是4字节的,区分不同类型的目的就是为了指示:指针指向的内存的数据宽度,即该指针指向的地址开始存放的数据是多少字节的,进而实现数据对齐.

a是个数组,"a"这个标识符映射为常量指针,其类型为 int (*)[6],指向数组首地址,因此可以直接赋值给p.

注意p的数据宽度也是4*6=24,如果p++,那么递增的是24个字节.所以这种类型的指针也称为行指针,因为以行为基本单位.

    因此,二维数组指针就是行指针.

2)int *

单个int类型元素的指针,也可以作为一维数组的指针,同样原因:数据宽度一致,都是4字节.

因此a[0]表示数组首行,而行数据是个int型的一维数组,因此其类型为 int *,所以可以直接赋值.

同样 a[0][0]表示数组首行首元素,因此取地址后也可以直接赋值给int *类型指针.


最后再次重申,解读指针定义或者分析右值类型时,数据宽度是关键所在.

附图显示数组首地址值=行首地址值=第一个元素地址值,但是类型是不同的.

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-11-27

举例说明:

int a[3][4];

&a[0][0]的类型是int *

&a[0]的类型是指向一个4个元素的一维int类型数组

本回答被网友采纳
第2个回答  2019-11-27
以二维数组 int a[2][2];为例
既知表达式 a 的值即&a[0]或者是a+0的值
类型是int**
a[0]的值即&a[0][0]
某一个行的指针,以a[0],即第一行的指针为例,其含义是a[0][0]的地址值
某 一元素 的地址的表达式,&a[0][0], 为第一行第一个元素的地址,&a[1][1]是第二行第二个元素的地址
某一行(以第x行为例)元素的指针是该行第一个元素的地址值,表达式是&a[x-1][0]或者a[x-1]
相似回答