• C语言学习笔记--数组参数和指针参数


    1. 数组参数退化为指针的意义

    (1)C 语言中只会以值拷贝的方式传递参数,当向函数传递数组时,将整个数组拷贝一份传入函数导致执行效率低下,C 语言以高效作是最初的设计目标,所以这种方法是不可取的。

    (2)参数位于栈上,太大的数组拷贝将导致栈溢出。

    (3)将数组名看做常量指针,传递的是数组的首元素地址,而不是整个数组。

    2. 二维数组参数

    (1)二维数组参数同样存在退化的问题:

        二维数组可以看做是一维数组,其中的每个元素又是一个一维数组

    (2)二维数维参数中第一维的参数可以省略

        ①void f(int a[5])←→void f(int a[])←→void f(int* a)

        ②void g(int a[5][3])←→void g(int a[][3])←→void g(int (*a)[3]);

    (3)等价关系

    数组参数

    等效的指针参数

    备注

    一维数组:float a[5]

    指针:float* a

    相当于数组去掉第1维,然后把数组名前加上*。

    指针数组:int* a[5]

    指针的指针:int** a;

    二维数组:char a[3][4]

    数组的指针:char(*a)[4]

    (4)被忽视的知识点

        ①C 语言中无法向一个传递任意多维数组。换一句话讲,形参 int a[][3]是合法的,但 inta[][]是非法的。

        ①因此,必须提供除第 1 维之外的所有其他维长度。第一维之外的维度信息用于完成指针运算。

    传递与访问二维数组

    #include <stdio.h>
    
    void access(int a[][3],int row) //a[][3],形参第2维的长度必须提供
    {
        int  col = sizeof(*a)/sizeof(int);
        
        int i = 0;
        int j = 0;
        
        printf("sizeof(a) = %d
    ",sizeof(a)); //指针,4字节
    
        //a为int (*a)[3]类型,即a指向一个有3个int型元素的数组
        printf("sizeof(*a) = %d
    ",sizeof(*a));//3*4 =12字节
        
        for(i = 0;i < row; i++)
            for(j = 0; j < col; j++)
            {
                printf("%d
    ", a[i][j]);
            }
        
        printf("
    ");
    }
    
    void access_ex(int b[][2][3],int n) //数组参数的第2、3维长度必须提供
    {    
        int i = 0;
        int j = 0;
        int k = 0;
        
        printf("sizeof(b) = %d
    ",sizeof(b)); //指针,4字节
    
        //b为int (*b)[2][3]类型,即b指向一个有2行3列int型元素的二维数组
        printf("sizeof(*b) = %d
    ",sizeof(*b));//2 * 3 * 4 = 24字节
        
        for(i = 0;i < n; i++)
            for(j = 0; j < 2; j++)   
                 for(k = 0; k < 3; k++)
                 {
                     printf("%d
    ", b[i][j][k]);
                 }
        
        printf("
    ");
    }
    
    int main()
    {
        int a[3][3] = {{0, 1, 2},{3, 4, 5},{6, 7, 8}};
        int aa[2][2] = {0};
        int b[1][2][3] = {0};
    
        access(a, 3);
        //access(aa,2);//error,int(*)[2]与int (*)[3]类型不匹配
    
        access_ex(b, 1);
        //access_ex(aa,2);//int(*)[2]与int(*)[2][3]类型不匹配
    
        return 0;
    }

     

    参考资料:
    www.dt4sw.com
    http://www.cnblogs.com/5iedu/category/804081.html

     

  • 相关阅读:
    关于写页面时容易发生的问题
    用wamp实现前端和php的交互效果
    原生封装的ajax
    用angular引入复杂的json文件2
    用angular引入复杂的json文件
    vue属性
    vue的事件
    require'模块化jquery和angular问题
    css3在页面中插入内容
    css3+javascript实现翻页幻灯片
  • 原文地址:https://www.cnblogs.com/CoderTian/p/5911441.html
Copyright © 2020-2023  润新知