#include <stdio.h>
#include <string.h>
int main()
{
//多维数组的初始化
//[行][列] 一个平面
int array1[3][3]={1,2,3,4,5,6,7,8,9};
int array2[3][3]={{1,2,3},{4,5},{1}};
int array3[ ][3]={1,2,3,4,5,6,7,8,9};
//int arrayT0[3][ ]={1,2,3,4,5,6,7,8,9}; //XXX
int arrayT1[ ][3][3]={1,2,3,4,5,6,7,8,9}; //多个的平面
int arrayT2[ ][1][3][3]={1,2,3,4,5,6,7,8,9};
//结论:数组的定义必须至少指定除第一维以外其它维度的大小
int x=3,y=6,w=0,i,c;
int array4[x][y]; memset(array4,0,sizeof(array4));
for(i=0;i<x;i++)for(c=0;c<y;c++)array4[i][c]=w++;
printf("array1:");for(i=0;i<3;i++)for(c=0;c<3;c++)printf("%d",array1[i][c]);printf("\n");
printf("array2:");for(i=0;i<3;i++)for(c=0;c<3;c++)printf("%d",array2[i][c]);printf("\n");
printf("array3:");for(i=0;i<3;i++)for(c=0;c<3;c++)printf("%d",array3[i][c]);printf("\n");
printf("array4:");for(i=0;i<3;i++)for(c=0;c<3;c++)printf("%d ",array4[i][c]);printf("\n");
printf("array size:%d %d address:%p %p : %p %p value:%d %d : %d %d\n"
,sizeof(array4),sizeof(array4[1]),array4,array4+1,array4[1],array4[1]+1,*array4[1],*(array4[1]+1),array4[1][0],array4[1][1]);
//array4[1]可看成是array4[1][0]~array4[1][5]元素的数组名(1.代表下一维度数组的首地址,2.代表下一维度数的整体空间占用)
//array4+1:这个表达式是在做地址运算:地址加1实际加了1行的空间占用值
//array4[1]+1:在这里仍然是在做地址运算:地址加1实际加了1列空间占用值
//地址运算不能简单的看成是算术运算。地址运算的单位值具有一个放大值属性。
//具体放大多少字节,看参与运算的对象是什么具体的数据类型,具体的数据类型下是不是有特殊的用法规定。
for(i=0;i<x*y;i++)printf("%d ",array4[0][i]);printf("\n");
//这是一种越界访问行为,但是在这里是安全的,因为后边的内存空间已经确实存在。
}
六、数组(例3---多维数组)
最新推荐文章于 2021-08-13 15:50:49 发布