#include <stdio.h>
int main()
{
int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};
/*从二维数组的角度看,a代表是二维数组的首元素的地址,
现在的首元素不是一个简单的整型元素,而是由4个整型元素所组成的一维数组,因此a代表的是首行(即序号为0的起始地址)
a+1代表的是序号为1的行的起始地址(跨过了4个整型数据,即跨过了1,3,5,7)。*/
printf("%d\t%d\t%d\n",a+1,a[1],&a[1][0]);//a+1的值和a[1]的值和&a[1][0]的值一样,表示的都是第一行第0列的元素地址
//a[0]+1表示为第0行第一列的元素的地址,1个整型元素占据4个字节,故a[0]+1跨过了1个整形元素,4个字节。
printf("%d\t%d\n",a[0]+1,&a[0][1]);//两者都表示的是第0行第1列元素地址值
/*
a[0]和*(a+0)等价,a[i]和*(a+i)等价;
a[0]+1 <-> *a+1 <-> &a[0][1], a[1]+i <-> *(a+1)+i <-> &a[1][i] (<->表示等价符号)
*/
printf("%d\t%d\t%d",a[1]+1,*(a+1)+1,&a[1][1]);//均表示第一行第一列的元素地址
return 0;
}
注:&a[i]和a[i]的值相同,但是&a[i]指的是行,而a[i]指的列。
(1)指向多维数组元素的指针变量
#include <stdio.h>
int main()
{
int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};
int *p;//p是int *型指针变量
for(p=a[0];p<a[0]+12;p++)//使p指向下一个元素
{
if((p-a[0])%4==0)//p移动4次后换行
printf("\n");
printf("%d\t",*p);//输出p指向的元素的值
}
printf("\n");
return 0;
}
(2)指向由m个元素组成的一维数组的指针变量
上例的指针变量p是用“int *p:”定义的,它是指向整型元素的,p+1所指向的元素是p所指向的列元素的下一元素(如p指的是a[0][0],则p+1指的是a[0][1])(按在内存中储存的下一整型元素)。
而本例可以改用另一种方法,使p不是指向整型变量,而是指向一个包含m个元素的一维数组。这时,如果p先指向a[0](即p=&a[0]),则p+1不是指向a[0][1],而是指向a[1],p的增加值以一维数组的长度为单位。
#include <stdio.h>
int main()
{
int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};
int (*p)[4],i,j;//指针变量p指向包含4个整型元素的一维数组(*p两边的括号不能可缺少)
p=a;//p指向二维数组的0行
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
printf("%4d",*(*(p+i)+j));
}
printf("\n");
}
return 0;
}
详细可以去看《C程序设计(第五版)》谭浩强著