#include
/*
* 参数传递为指针
* */
int print_one_dimen(int *arr,int num){
int i;
for(i=0;i){
printf("%d ",arr[i]);
}
printf("\n");
}
/*
*在参数传递中,arr任然是指针,所以这种参数传递方式和指针的传递方式任然一样,有无数字一样,底层实现都将arr视为指针
* */
int print_one_dimen1(int arr[5],int num){
int i;
for(i=0;i){
printf("%d ",arr[i]);
}
printf("\n");
}
/*
* 我们能类比像一维数组那样,用二维指针接收参数吗?不能,这样会导致段错误的发生
* */
int print_two_dimen(int **arr,int row,int column){
int i,j;
for(i=0;i){
for(j=0;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){
for(j=0;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){
for(j=0;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);
}