一.前言:
对于数组想必大家都不陌生首先得要知道的是对于数组元素在内存存储是连续性的。
例如:
char a[10] //那么数组a的各个原数在内存中的存储地址为:0X01~0X10
而一维数组相对于多维数组来说很简单的,然而数组a就表示的是整个数组内存段的首地址也就是0X01,那可可想而知变量a存得值就是一个地址,到此不难看出a就是一个指针。。。(不理解的可以看看我之前呢写的有关指针的介绍就清楚了此处不再重复解释)。
对于a存放的地址和&a的地址有啥区别了?
int c[10];
int(*p)[10]; //定义一个指向10个int宽度的指针
p = &c;
printf("c的地址:%p\n",c);
printf("&c的地址:%p\n", &c);
printf("p存的地址:%p\n", p);
结果:
重结果可以看出a存的地址等于&a的地址(指针a的地址),可是他们真的完全一样吗?打那是不完全一样。例如:
char c[10];
char(*p)[10];
p = &c;
printf("c的地址:%p,c+1的地址为:%p\n",c,c+1);
printf("&c的地址:%p,&c+1的地址为:%p\n", &c,&c+1);
printf("p存的地址:%p,P+1存的地址为:%p\n",p, p+1);
结果:
这里说明了虽然&a的地址和a存的地址相同都为首地址但是两者意义不一样&a表示整个数组地址a表示首元素地址,同理如果要接收整个数组地址要用指向10数据宽度的指针即 char(*p)[10];
注意:数组字母虽然表示指针但是他是不能修改的左值即不能执行++运算等。
二.二维数组和多维数组。
存储方式:
一维存储方式:
表示每个元素占据一个内存单元。
二维数组:char a[3][6]
从存储单眼我们可以看出:二维数组中存有3个一维数组并且这三个一维数组都是含有6个char型的数组。
由此可以看出多维数组实际上就是由多个一维数组构成。
例如:char a[2][2][2]:表示数组a中有2个元素,这两个元素又由2个元素构成,这三个元素又包含了2个char型元素表示为:
{{{{},{}},{{},{}}},{{{},{}},{{},{}}}}
二维数组和指针:
同理二维数组名指向的是数组中每一个一维数组。例如 char a[2][2] a指向第一个元素地址即是:&a[0][0]地址
总之数组名表示的是整个数组中最外层的数据元素如果是二维数组那么他表示的就是第一层的表示一维数组的元素项,若要继续项内层访问就要*a解引用。
注意:a[1]等价于*(a+1)是一个指针的解引用可能是地址也可能是数。
a[1][1]等价于*(*(a+1)+1)而&a[1]代表二维数组第二个人元素项的地址实际上a[1]可以用一个一个一级指针接收。
对于该用什么指针接收实参具体得看传进来的内容是什么。。。。