一、一维数组
1.先定义一个一维数组
int a[4]={1,2,3,4};
(1)一维数组名a是个地址,地址类型为:int *
(2)一维数组名取地址&a是个地址,地址类型同:int (*p)[4], 也即&a指向含4个int元素的一维数组 此时&a类型即为一个数组指针
2.数组名是数组首元素的首地址
a的值和&a[0]的值相同 但 意义不同
3.意义不同在哪里
先实现一串代码
#include <stdio.h>
#include <stdlib.h>
int main() {
int a[3] = { 0 };
printf("a =%d\n", a );
printf("a+1 =%d\n", a + 1);
printf("&a+1=%d\n", &a + 1);
system("pause");
return 0;
}
运行结果:
“+1”就是偏移量问题:一个类型为T的指针的移动,是以sizeof(T)为移动单位
即a+1:在数组首元素的首地址的基础上,偏移一个sizeof(a[0])单位。此处的类型T就是数组中的一个int型的首元素。
&a+1:在数组的首地址的基础上,偏移一个sizeof(a)单位。此处的类型T就是数组中的一个含有3个int型元素的数组
4.a[0]和&a[0]
#include <stdio.h>
#include <stdlib.h>
int main() {
int a[3] = { 0 };
printf("a =%d\n", a);
printf("a+1 =%d\n", a + 1);
printf("&a[0]+1 =%d\n", &a[0] + 1);
printf("&a+1 =%d\n", &a + 1);
printf("a[0]+1 =%d\n", a[0] + 1);
system("pause");
return 0;
}
运行结果:
可以看到&a[0]+1的值其实和a+1的值是相同的
而a[0]+1其实就是0+1=1
二、二维数组
1.定义一个二维数组
int b[3][4]={0};
此时二维数组可以看成是有3个成员的一维数组,每个一维数组有4个元素
2.解释
(1)b[0]是个一维数组名,也是个地址,地址类型为:int *
(2)&b[0]是个地址,地址类型同:int (*p)[4], 也即&b[0]指向含4个int元素的一维数组
更进一步:
(3)b是个地址,地址类型同:int (*p)[4],也即b指向含4个int元素的一维数组
(4)&b是个地址,地址类型同:int (*p)[3][4],也即&b指向含3x4个int元素的2维数组
*注意:尤其注意上面的(3),这条结论指出了:二维数组名实际上是一维数组的地址!
验证:
#include <stdio.h>
#include <stdlib.h>
int main() {
int b[3][4] = { 0 };
printf("b =%d\n", b );
printf("b+1 =%d\n", b + 1);
printf("&b+1=%d\n", &b + 1);
system("pause");
return 0;
}
运行结果:
同上述一维数组a+1 &a+1
3.其他
#include <stdio.h>
#include <stdlib.h>
int main() {
int b[3][4] = { 0 };
printf("b =%d\n", b);
printf("b+1 =%d\n", b + 1);
printf("&b[0]+1 =%d\n", &b[0] + 1);
printf("&b+1 =%d\n", &b + 1);
printf("b[0]+1 =%d\n", b[0] + 1);
printf("&b[0][0]+1 =%d\n", &b[0][0] + 1);
system("pause");
return 0;
}
运行结果:
b[0]+1就相当于一维数组中的a+1 只是偏移一个元素
&b[0][0]即相当于一维数组中&a[0]
三、总结
1.数组名,是指向它的第一个一级成员的指针
2. 数组名取地址,是指向整个数组的指针
//所谓一级成员,举个例子,int a[5],那么数组a的一级成员就是int型变量;int b[10][5],数组b的一级成员是int [5]的一维数组
3.数组名是数组首元素的首地址
---------------------
部分参考:
原文:https://blog.csdn.net/qq_31073871/article/details/80800858