数组与指针

#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);



}

 

posted on 2022-02-18 21:37  andyAngelo  阅读(28)  评论(0编辑  收藏  举报