#include <stdio.h> /* * 参数传递为指针 * */ int print_one_dimen(int *arr,int num){ int i; for(i=0;i<num;i++){ printf("%d ",arr[i]); } printf("\n"); } /* *在参数传递中,arr任然是指针,所以这种参数传递方式和指针的传递方式任然一样,有无数字一样,底层实现都将arr视为指针 * */ int print_one_dimen1(int arr[5],int num){ int i; for(i=0;i<num;i++){ printf("%d ",arr[i]); } printf("\n"); } /* * 我们能类比像一维数组那样,用二维指针接收参数吗?不能,这样会导致段错误的发生 * */ int print_two_dimen(int **arr,int row,int column){ int i,j; for(i=0;i<row;i++){ for(j=0;j<column;j++){ printf("%d ",arr[i][j]); } } printf("\n"); } /* * 同样类比一维数组,可以为arr[5][5],arr[][5];但是不能为arr[][],使用arr[][]直接编译错误 * 那这儿的 int arr[5][5]或者 int arr[][5] 是什么类型呢?是,int (*)[5] 指向数组的指针, * 那这样,参数写成该类型的指针也能正确执行 * */ int print_two_dimen1(int arr[5][5],int row,int column){ int i,j; for(i=0;i<row;i++){ for(j=0;j<column;j++){ printf("%d ",arr[i][j]); } } printf("\n"); } /* * 一维数组,传递的参数为一维指针 * 二维数组,传递的参数也为一维指针,只是指针的指向不同,指针指向一维数组 * */ int print_two_dimen2(int (*arr)[5],int row,int column){ int i,j; for(i=0;i<row;i++){ for(j=0;j<column;j++){ printf("%d ",arr[i][j]); } } printf("\n"); } int main(int argc,char **argv) { /* 一维数组 */ int one_dimen[5] = {1,2,3,4,5}; /* 传递一维数组参数,并打印shu'zhu一维数组 */ print_one_dimen(one_dimen,5);//one_dimen 为一维数组的首元素的首地址,首元素为int,则首地址类型为 int * print_one_dimen(&one_dimen,5);//&one_dimen 为取数组的地址,类型为 int (*)[5],编译时报类型不匹配 print_one_dimen(one_dimen,5);//结果一样 /* 二维数组 */ int two_dimen[5][5] = {{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20},{21,22,23,24,25}}; //print_two_dimen(two_dimen,5,5);调用直接段错误,说明不能采用类比一维数组的方式传递参数 /* 那 two_dimen为什么类型呢?two_dimen也是数组的首元素的首地址,那二维数组的首元素是一维数组,一维数组的地址为 int (*)[5] * &two_dimen 为二维数组的地址,类型为 int (*)[5][5] * */ // 那既然采用上述的二维指针传值不行,原因是啥呢,原因就是c语言二级指针的定义了,为指向指针的指针。那么aar[i]为 *(arr+i),其值为地址,如果指针占 // 4个字节,那么对应空间中的int值为一维指针的值,那这样再取一维指针的值,就错了,那应该怎么传递二维数组呢 // print_two_dimen1(two_dimen,5,5); print_two_dimen1(&two_dimen,5,5);// 编译时报类型不匹配 print_two_dimen2(two_dimen,5,5); /*如果非要使用二维指针呢?又用到了指针数组*/ int *p[5]; p[0] = two_dimen[0]; p[1] = two_dimen[1]; p[2] = two_dimen[2]; p[3] = two_dimen[3]; p[4] = two_dimen[4]; print_two_dimen(p,5,5);// 使用二维指针作为函数的形参,也可以正常运行,但是得注意传递得参数为指针数组首元素首地址 print_two_dimen1(p,5,5);//此时运行不正确了,函数需要的参数为指向[5]数组的指针,为一级指针,而p为二级指针 int **p1 = p;//p 是数组名,代表数组首元素的首地址, print_two_dimen(p1,5,5); }