一维数组与指针
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]
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类型,但是两个指针之间不能这样操作