如何理解指针数组的地址相等?

是这样的,想请说下,如何理解指针数组的地址相等?
最新回答
仲夏柠叶香

2024-11-29 07:30:15

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 *类型指针.


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

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