C中的二维数组打印

来源:互联网 发布:河源市民网络问政平台 编辑:程序博客网 时间:2024/06/15 03:02

简单的打印一个二维数组,区分指向数组的指针(数组指针)和指针构成的数组(指针数组)


#include <stdio.h>void printAry( int (*a)[3], int num )  /* 注意,这里的3会被编译器记住,表示指针所指数的第一维的大小 */{int i = 0; int j = 0;for ( i = 0; i < num; i++ ){for ( j = 0; j < 3; j++ ){printf( "%4d ", a[i][j] );}printf( "\n" );}}void printAry2( int *a, int num ){int i = 0; int j = 0;for ( i = 0; i < num; i++ ){for ( j = 0; j < 3; j++ ){printf( "%4d ", *(a + i * num + j) );}printf( "\n" );}}void printAryInd( int * a[3], int num )   /* 注意,这里的3并不起任何作用,并不表示所传数组的大小,数组的大小由num指定 */{int i = 0, j = 0;for ( i = 0; i < num; i++ ){for ( j = 0; j < 3; j++ ){printf( "%4d ", a[i][j] );}printf( "\n" );}}void printAryIndTwo( int ** a, int num ){int i = 0, j = 0;for ( i = 0; i < num; i++ ){for ( j = 0; j < 3; j++ ){printf( "%4d ", a[i][j] );}printf( "\n" );}}int main(){inta[2][3] = {1,  2,3,11, 22, 33};int*b[3];int*c;inti = 0;for ( i = 0; i < 2; i++ ){b[i] = a[i];}c = (int *) a;printAry( a, 2 );printf( "%s\n", "--------------" );printAry2( c, 2 );      /* 可以强转成一个一维数组 */printf( "%s\n", "--------------" );printAryInd( b, 2 );    /* 这里只给数组前两个元素赋过值 */printf( "%s\n", "--------------" );printAryIndTwo( b, 2 );}



当实参是二位数组a[2][3]时,形参用(*arr)[3]指向数组的指针可行,而用*arr[3]指针数组运行为什么不能得到正确结果呢?


因为int (*arr)[3] 作为参数在和形参a[2][3]结合时,arr 是一个数组的指针,也就是指向 &a[0] 的地址,这个数组每个元素都 是 int [3]类型的一维数组 ,所以可以用二维数组首地址来作为形参。
而 int *arr[3]表示arr是一个数组的首地址,这个数组里保存的元素是3个int * 类型的指针元素。 当形参为int *arr[3]时,这里的3并不起任何作用,并不表示所传数组的大小,数组的大小由参数num指定。 

直接用数组a[2][3]首元素作为形参时,系统会报数据类型不匹配的错误。如果硬要调用printAryInd函数,则可以先定义一个 int *b[3],要这样赋值才行,int * b[3]={a[0],a[1],NULL}  不能直接传二维数组的首地址。


0 0