2020-05-19 多维数组和指针(存储单元和首地址)

一维数组与指针

1.定义一个一维数组,数组名是数组的<首地址>

     int a[5];  

a指向a[0] , a[0] int 的元素 ,a 的类型就是 int   

&a这个地址指向整个数组,&a的类型  int(*)[5]


访问数组元素的两种方法:

1.下标法

2.指针法

二维数组和指针


二维数组在内存依然连续一维数组的组合

数组名就是数组的首地址,首地址一段内存中的第一个存储单元

a[3][4]

数组名-a

a是二维数组的首地址

a指向二维数组第一个存储单元,一维数组a[0]

a的类型是int(*)[4];    a+1=4×4=16 字节

a[0]是一维数组的数组名;a[0]就是一维数组的首地址,a[0]指向元素a[0][0]; a[0]是数组名!a[0][0]是元素!

a[0]的类型是int*; a[0]+1=4  字节

因为a是二维数组 ; &a+1=48



三维数组和指针

int a[2][3][4]


两个二维数组,3个一维数组,4个元素

a指向了一个二维数组 , a指向a[0] ,a[0]是第一个一维数组

a[0]指向一个一维数组,a[0]指向a[0][0]

a[0][0]指向一个元素 ,


在三位数组中A  A[0]  A[0][0]的地址相同 , 但是三者的类型不同


访问数组的元素,

1.下标法

a[m][n]

2.指针法

*(a[m]+n)    //a指向a[0],a+1指向a[1],

*(*(a+m)+n)  //a+m 移动数组名,*(a+m),*(a+m)是数组名也是数组的首地址

//先移动一维数组,在用*将指针转换为数组名再在一级数组内的元素之间用指针进行偏移


int a[3][4]

a的类型  int(*)[4]

&a的类型int(*)[3][4]

a[0]的类型int(*)

a[0][0]的类型int



指针法访问多维数组

用指针法迭代打印数组元素
输出结果



指针和多维数组

输出结果

输出结果 二维数组A和一维数组A[0]的地址相同,它们地址都是各自首元素的地址。和&A[0][0]的地址相同。

A+1指向一个一维数组存储单元,一个一维数组含两个int类型移动8个字节;(十六进制 38+4得3c)

A[0]+1指向一个数组内部元素,移动4个字节;

指向多维数组得指针(重点首地址)

如何声明一个指针变量p指向一个二维数组(如A)。把指针声明为指向int得类型还不够,因为int只能和A[0]这种类型匹配,说明该指针指向一个int类型的值。

但是A是首元素的地址,它是一个内含两个int类型的一维数组,故声明如下:

A   int(*p)[2];          //内含两个int类型的数组。

重点:

区分 int*p2[2] 和 int(*p)[2]

一个是内含两个指针的一位数组的p2,一个是声明一个内含两个元素的一维数组的二维数组的首地址p

1.由于[]优先级高,与p2结合,p2成为内含两个元素的数组,然后*表示p2数组中内含两个指针,最后int表示p2数组中都指向int类型。

2.首先是两个int类型的数组,(*)结合,声明一个指向数组的指针,数组内含有两个元素。

指针的兼容性

指针之间的兼容性比数值之间的赋值更严格,不用类型转换就能将int类型转换成double类型,但是两个指针之间不能这样操作


你可能感兴趣的:(2020-05-19 多维数组和指针(存储单元和首地址))