在谈到数组时, 我们总是将他们与指针混在一起。下面,我将谈谈数组的一些伪装。
1:数组名总共在四个地方表现的不同。
一:在 sizeof(数组名)这个时候数组名代表的是整个数组的长度,即也就是总元素乘以每个元素占的空间大小。
二:在引用的状态下,int (&br)[10]=数组名,这是数组名也是代表了整个长度。
三:在数组名当形参的时候,他就退化成了一个指针。
四:在其他的情况下,数组名代表的都是首元素的地址。
2:一维数组和二维数组的区别
其实 二维数组可以看成是一维数组组成的。只是他的“元素”发生了变化,一维数组里面的数组名代表的元素就是数组首元素的地址,而二维数组的数组名的元素代表的是一个指向一维数组的地址。怎么理解那?
比如:
#include<stdio.h>
int main()
{
int a[6]={1,2,3,4,5,6};
int *p=&a;
int s1[2][3]={1,2,3,4,5,6};
int (*p1)[2][3]=&s1;
int (*p2)[3]=s1;
int (*p3)[3]=&s1[0];
int *p4=s1[0];
return 0;
}
int main()
{
int a[6]={1,2,3,4,5,6};
int *p=&a;
int s1[2][3]={1,2,3,4,5,6};
int (*p1)[2][3]=&s1;
int (*p2)[3]=s1;
int (*p3)[3]=&s1[0];
int *p4=s1[0];
return 0;
}
当p+1是内容就是2,而当p2+1时指的就是s1[1][0],他直接加了一个一维数组的长度。
那在一维数组里面怎么可以取到像二维数组一样的指向一个一维数组的地址那,那就需要用到&符了。
例如上面的p指向的就是一维数组 的指向,大家可以直接上级试试。
说到二维数组与一维数组的关系,下面我们就来推到推倒。
假设在内存有一段的连续的地址,分别存放了二个一维数组a0,a1。每个数组分别包含三个数据,我们定义一个指向一维数组的指针。即 int (*s)[3]=a0;如果我们要去找a1里面的第三个数。就可以这样求。 *(*(s+1)+3)我们知道下标和指针的关系,把此式改写成指针的形式。s[1][3],这不就是二维数组吗?
由此可以看出,二维数组就是由一维数组组成的。只是他们作为数组名时代替的元素不同而已。