#include <stdio.h>
/*
(一)输入参数为二维数组,函数形参为二维指针
(1)二维数组不能直接作为输入参数传给形参为二维指针的函数,如果要作为参数传递,在传递前必须进行强制类型转换(如果不转换gcc会报warning,而g++由于进行强制类型检查,会报error);
(2)作为形参的二维指针在函数内部不能够像二维数组那样采用下标的方式来来引用,必须手动计算内存寻址;
(3)由于传递的是地址,值的改变会影响到实参的值。
原因:
(1) 二维指针的内存分配不一定是连续的;而二维数组的内存分布是连续的,他们的类型也不一样;
(2) 根据运算符优先级, 二维指针 TYPE **p,表示p所指向的类型是TYPE类型的指针;
*/
void testArray01(int **pArray,int N_row,int N_column)
{
int Index_row,Index_colomn;
for(Index_row=0;Index_row<N_row;Index_row++){
for(Index_colomn=0;Index_colomn<N_column;Index_colomn++){
printf("%d ",*((int *)pArray + Index_row * N_column+ Index_colomn));
}
printf("
");
}
//modify pArray value
for(Index_row=0;Index_row<N_row;Index_row++){
for(Index_colomn=0;Index_colomn<N_column;Index_colomn++){
*((int *)pArray + Index_row *N_column + Index_colomn)=(*((int *)pArray + Index_row * N_column +Index_colomn))*10;
}
}
}
/*
(二)二维数组作为输入参数
(1) 函数形参的几种方式 : pArray[M][N],pArray[][N],(*pArray)[N]
(2) 第二维的大小不能省略
原因:
编译器在寻址时是按pArray+ Index_row * N_column + Index_colomn来对p[Index_row][Index_colomn]进行寻址的,所以第二维参数必须给出;
*/
void testArray02(int (*pArray)[2],int N_row,int N_column)
{
int Index_row,Index_colomn;
for(Index_row=0;Index_row<N_row;Index_row++){
for(Index_colomn=0;Index_colomn<N_column;Index_colomn++){
printf("%d ",pArray[Index_row][Index_colomn]);
}
printf("
");
}
}
/*
(三)TYPE (*pArray)[N] 与TYPE*pArray[N]
TYPE (*pArray)[N] 与 TYPE *pArray[N]含义不同,根据运算符优先级,(pArray*)[N]表示pArray所指向的类型是长度为N的TYPE类型的数组,pArray为指针;*pArray[N]表示数组pArray的成员为TYPE类型的指针,pArray为数组。
*/
void testArray03()
{
chararray[3][10]={"luowei","test1","test2"};
char (*p1)[10]=array;
char *p2[10];
int Index_row;
for(Index_row=0;Index_row<3;Index_row++){
p2[Index_row]=array[Index_row];
printf("p1[%d]=%s p2[%d]=%s
",Index_row+1,p1[Index_row],Index_row+1,p2[Index_row]);
}
}
main()
{
intT_array[3][2]={1,2,3,4,5,6};
printf("****************testtestArray01:
");
int** p_temp=(int **)T_array;
testArray01(p_temp,3,2);
printf("****************testtestArray02:
");
testArray02(T_array,3,2);
printf("****************testtestArray03:
");
testArray03() ;
}