二维数组的讨论

/*
**** VC++6.0中测试 ****
*/

#include

int main(void)
{
int a1[2][5]={{0,1,2,3,4,},{5,6,7,8,9}};//赋初值
int i,j;
int *p1;
int (*p2)[5];

//二维数组常用操作方法:2种
//总结:操作二维数组时,定义的是 int (*p2)[5](一维数组型指针)?(为什么降维定义?)
//原因:定义指针是为了方便操作数组(元素的值),而不是数组的地址。所以要降维定义
//这是一个伪命题,在int (*p2)[5]中,(*p)是一维,[5]又是一维,也是两维。

//第一种:指向数组元素的指针变量
p1=a1[0];


printf("first\n");

for(i=0;i<2;i++)
for(j=0;j<5;j++)
printf("%d ",*p1++);
//第二种:指向数组的指针变量
p2=a1;

printf("second\n");
for(i=0;i<2;i++)
for(j=0;j<5;j++)
printf("%d ",*(*(p2+i)+j));

printf("end\n");

/*
//二维数组符号理解
int a1[2][5]={{0,1,2,3,4,},{5,6,7,8,9}};//赋初值
int a;
int *p1;
int (*p2)[5];

int (*p3)[2][5];

//    p1=a1;// warning C4047: '=' : 'int *' differs in levels of indirection from 'int (*)[5]'
      p2=a1;//说明a1是'int (*)[5]'类型,a1是一个(数组)指针类型,指向有5个元素的数组,数组中的元素是int类型
    //a1是数组名,在这(可以看成一维数组有2个元素,a1[0]是首元素)表示(a1[0])的 (首)地址【与一维数组定义相吻合】


// p1=&a1;// warning C4047: '=' : 'int *' differs in levels of indirection from 'int (*)[2][5]'
// p2=&a1;// warning C4048: different array subscripts : 'int (*)[5]' and 'int (*)[2][5]'
p3=&a1;////a1是数组名,&a1表示二维数组的 首地址


p1=*a1;

// p2=*a1;//warning C4047: '=' : 'int (*)[5]' differs in levels of indirection from 'int *'

  //说明*a1是int * 类型,表示二维数组的首元素首地址
//---------------------------------------------------------------------------------------------------------------

p1=a1[0];//说明a1[0]是int * 类型,表示二维数组的首元素首地址,与*a1意义相同

// p1=&a1[0];// warning C4047: '=' : 'int *' differs in levels of indirection from 'int (*)[5]'
p2=&a1[0];//说明&a1[0]是'int (*)[5]'类型,与a1意义相同

// p1=*a1[0];// warning C4047: '=' : 'int *' differs in levels of indirection from 'int '
// p2=*a1[0];// warning C4047: '=' : 'int (*)[5]' differs in levels of indirection from 'int '
a=*a1[0]; //*a1[0]是int类型,表示首元素,同时佐证a1[0],是二维数组的首元素首地址

//---------------------------------------------------------------------------------------------------------------
a=a1[0][0];//a1[0][0]表示数组首元素,与*a1[0]相同

p1=&a1[0][0];//&a1[0][0],表示数组首元素首地址

// p1=*a1[0][0];// warning C4047: '=' : 'int *' differs in levels of indirection from 'int '
// a=*a1[0][0];// error C2100: illegal indirection
    //a1[0][0]表示数组首元素,*a1[0][0]对数组元素区内容,【无意义】(*是对指针操作)
//---------------------------------------------------------------------------------------------------------------

printf("a1= %p\n",a1);
printf("&a1= %p\n",&a1);
printf("*a1= %p\n",*a1);

printf("a1[0]= %p\n",a1[0]);
printf("&a1[0]= %p\n",&a1[0]);
printf("*a1[0]= %p\n",*a1[0]);

printf("a1[0][0]= %d\n",a1[0][0]);
printf("&a1[0][0]= %p\n",&a1[0][0]);

//二维数组赋初值
/*
int a[2][5]={0,1,2,3,4,5,6,7,8,9};//赋初值
int a1[2][5]={{0,1,2,3,4,},{5,6,7,8,9}};//赋初值
int a2[2][5]={0,1,2,3,4,5};//部分赋初值,其余为0
int a3[2][5]={{0,1,2,3},{5,6,7}};//部分赋初值,其余为0

printf("a[0][3]= %d\n",a[0][3]);
printf("a1[0][3]= %d\n",a1[0][3]);
printf("a2[1][3]= %d\n",a2[1][3]);
printf("a3[0][4]= %d\n",a3[0][4]);
printf("a3[1][0]= %d\n",a3[1][0]);
*/

return 0;

}


你可能感兴趣的:(C语言编程)