二维数组的指针,某一行的指针,某一元素的指针各代表什么含义? 5
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 *类型指针.
最后再次重申,解读指针定义或者分析右值类型时,数据宽度是关键所在.
附图显示数组首地址值=行首地址值=第一个元素地址值,但是类型是不同的.
既知表达式 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]