我们有时会遇到*a或者*(&a)之类的数组使用,a为数组名。那么今天就来简单介绍一下这些:
比如说我们定义一维数组 int a[100];
我们都知道一维指针名 a 保存的是数组首元素的地址,那么是否我们对数组进行遍历就可以像指针一样 a++ 来遍历呢?
答案是不能,因为上面数组首字母的解释并不完整,完整的说法是一维数组名是一个指针常量,它保存数组首元素的地址。
而我们知道,常量是保存在全局数据区中or段(即only red) 只读,并不能进行其他操作。所以不能像指针一样对a++,如果我们想遍历可以把这个地址给一个指针p,让p++。
还有以下几个点需要注意:
&a: 对一维数组名取地址 == 数组的地址;
*(&a): 对一维数组的地址取值 == 数组首元素的地址;
这两个公式可以帮助我们推广到二维数组,三维数组:
例如有二维数组 int b[100][100];
&a : 对二维数组名取地址 == 二维数组的地址;
*(&a); 对二维数组的地址取值 == 二维数组中首个一维数组的地址;
对多维数组也是以此类推;
怎么去理解一个复杂定义的含义:
例如: *(*(a+i)+j);
让我们一步步去看:
1. a+i : 第 i + 1 个一维数组的地址(因为数组下标从0开始,所以是 i+1个)
2.*(a+i) : 第 i + 1 个一维数组的首元素的地址;
3.*(a+i)+j : 第 i + 1 个一维数组的第 j + 1 个元素的地址;
4.*(*(a+i)+j) : 第 I + 1 个一维数组的第 j + 1个元素的地址存放的值(即 a[I][j] 的值)