#include <stdio.h>
void main()
{int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
int *p;
//a是数组行的首地址而a[0]是数组的0行0列的地址,注意区别!!!!
//一开始a(这是个地址值)等于a[0](这也是个地址值),都指向元素a[0][0]的地址
//a[0]相当于{a[0][0],a[0][1],a[0][2],a[0][3]}的数组名
printf("a========%d\n",a);
printf("a[0]========%d\n",a[0]);
printf("\n");
//计算机按字节编址,int在内存中占有4个字节,每两个元素之间相差4个字节
printf("&a[0][0]===&&&&&&&&&&&&&====%d\n",&a[0][0]);
printf("&a[0][1]===&&&&&&&&&&&&&====%d\n",&a[0][1]);
printf("&a[0][2]===&&&&&&&&&&&&&====%d\n",&a[0][2]);
printf("\n");
//第一行和第二行相差16个字节
printf("&a[0][0]===&&&&&&&&&&&&&====%d\n",&a[0][0]);
printf("&a[1][0]===&&&&&&&&&&&&&====%d\n",&a[1][0]);
printf("\n");
//a[0]+1相当于以a[0]为数组名的地址加1,一开始a[0]指向a[0][0]即现在指向了a[0][1]这个元素的地址
//a[0]+1与&a[0][0]+1值是相等的
printf("a[0]+1======%d\n",a[0]+1);
printf("&a[0][0]+1======%d\n",&a[0][0]+1);
printf("\n");
//下一行的行地址(也a+1比a大了16个字节),简称“行地址”
printf("a+1======%d\n",a+1);
printf("\n");
//*(a+1)取下一行的行地址里面的值,取行首元素的地址,即下一行的的第一个元素的地址,简称“元素地址”
//*(a+i)是第i行的第一个元素的地址即a[i][0]的地址 *(a+1)指向的是第i行的首元素的地址,注意是“首元素”!!!
printf("*(a+1)===*************===%d\n",*(a+1));
printf("\n");
//取下一行的的第一个元素的地址里面的值也是首元素的值,即a[1][0]的值
printf("**(a+1)===*************===%d\n",**(a+1));
printf("\n");
//姑且认为a[0]为数组名,a[0]+1指向下一个元素即a[0][1],所以*(a[0]+1)==3
printf("*(a[0]+1)===*************===%d\n",*(a[0]+1));
printf("*(a[0]+2)===*************===%d\n",*(a[0]+2));
printf("\n");
printf("*(a[0]+4)===*************===%d\n",*(a[0]+4));
printf("\n");
printf("*(&a[0][0]+1)====*************==%d\n",*(&a[0][0]+1));
printf("\n");
//总之,a是只指向二维数组行“首”地址,简称“行首址”
//a[0]是指向二维数组元素的第一个元素的地址
for(p=a[0];p<a[0]+12;p++)
{
if((p-a[0])%4==0)printf("\n");
printf("%4d",*p);
}
printf("\n");
}
探究二维数组与指针的关系
最新推荐文章于 2024-03-23 22:46:47 发布