• 数组与指针


    #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);
    
    
    
    }
  • 相关阅读:
    python中使用easygui
    SQL Server: Windows Firewall with Advanced Security
    xxx while the managed IDbConnection interface was being used: Login failed for user xxx
    忽略PyCharm4中特定的警告提示信息
    C#如何生成一个随机种子for Random?
    PSSecurityException之PowerShell权限设置
    如何用CSS进行开发
    为什么不建议用table进行布局
    Batch脚本获取日期SET YEAR=%date:~10,4%
    Java实现邮箱找回密码
  • 原文地址:https://www.cnblogs.com/zjsthunder/p/15790306.html
Copyright © 2020-2023  润新知