数组名的意义

数组名的意义
1.数组名是地址常量(常量不能被赋值),代表数组的首地址=第一维的地址=首元素的地址

2.因此,
a.对一维数组a[m]:  &a[i] <=> a+i   a[i]<=>*(a+i)
特别地,当i=0时,&a[0]<=>a,   a[0]<=>*a
b.对二维数组a[m][n]: &a[i][j] <=> a[i]+j <=>*(a+i)+j
                    a[i][j]<=>*(a[i]+j)<=>*(*(a+i)+j)
特别地,当i=j=0,&a[0][0]<=>a[0]<=>*a
        a[0][0]<=>*(a[0])<=>**a

3.定义二维数组时,数组元素地址连续(参见下图),因而可以将二维地址转换为一维,即
&a[i][j] <=> a[i]+j <=>(a+i)+j<=>*(a+i*n+j)
a[i][j]<=>
(a[i]+j)<=>((a+i)+j)<=>*(*(a+i*n+j))
n为数组第二维大小
但动态分配内存的二级指针不能这样,地址不连续

#include<stdio.h>

int main()
{
	int a[3][3];
	int i, j;
	//输出地址
	for(i=0; i<3; i++)
	{
		for(j=0; j<3; j++)
			printf("%d  ",&a[i][j]);
		putchar(10);
	}	
	
	printf("数组名a:           %d\n",a);
	printf("首元素地址&a[0][0]:%d\n",&a[0][0]);
	printf("第一维地址&a[0]:   %d\n",&a[0]);

	//二维数组赋值
	for(i=0; i<9; i++)
		scanf("%d",&a[0][i]);//等价于*a+i
	//输出二维数组
	for(i=0; i<3; i++)
	{
		for(j=0; j<3; j++)
			printf("%-3d",*(*(a+i)+j));//等价于a[i][j]
		putchar(10);
	}
	printf("%d\n",**a);//第一个元素
	return 0;
}

在这里插入图片描述

发布了11 篇原创文章 · 获赞 7 · 访问量 1690

猜你喜欢

转载自blog.csdn.net/qq_43015237/article/details/103333729