• 多维数组


    基本常识
    1.存储顺序:行序为主,多维数组的存储是连续的,二维数组A[m][n]可以看作是m个向量,向量的维度是n维。存储时先存储一个向量,再接着连续存储余下的。
    2. 多维数组的访问,A是一个二维数组的第一个子数组名,在初始化一个二维数组时,编译器分配好空间的同时,还把第一个数组的地址赋给数组名A,它是常量不可改变。
        A[m][n],其实是间接访问表达式*(*(A+m)+n),(A+m)是指向数组的指针,
        *(A+m)变为整型指针,还有很多不同的形式,实在太吓人了,这里就不说了
    3.指向数组指针:声明 int (*p)[5]是一个指向数组大小为5的数组指针,下标引用符优先级高,但是有括号,因此先考虑(*p),所以p是一个指针,可以这样理解。
    int (*p)[5]=A,p++就是在矩阵的每一行移动。如果需要在矩阵的每一个整型元素移动,int *p2=&A[0][0],p++ 
    4.多维数组作为函数参数,func(int (*p)[5]),不可以像一维数组那样用int **p,这是指向整型指针的指针,与指向整型数组的指针不一样。
    

    下面有请例子登场~


    参考文章:
    [1]C语言:多维数组做函数参数(https://blog.csdn.net/zzwtyds/article/details/78008889)

    //用整型指针遍历二维数组
    int main()
    {
    int matrix[4][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
    int *mp;
    mp=&matrix[0][0];
    for(int i=1;i<=16;i++){
        printf("%d ",*mp++);
    }
    }
    
    //指向多维数组的指针
    int main()
    {
        int matrix[4][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
        int (*mp)[4];
        mp=matrix;
        for(int i=1;i<=4;i++)
            printf("%d ",mp++);
    //6356664 6356680 6356696 6356712
    }
    
    //多维数组名作函数参数的几个例子
    #include <stdio.h>
    int max_value(int array[][4]);
     
    int main( )
    {
        int b[3][4]={{1,2,3,4},{5,6,7,8},{9,13,14,23}};
        printf("max value is %d
    ",max_value(b));
        return 0;
    }
     
    //求最大值[1]
    int max_value(int array[][4])
    {
        int i,j,max;
        max=array[0][0];
        for(i=0;i<3;i++)
        {
            for(j=0;j<4;j++)
            {
                if(array[i][j]>max)
                {
                    max=array[i][j];
                }
            }
        }
        return max;
    }
    
    //求平均分
    #include <stdio.h>
    void average(int *p,int n);
    void search(int (*p)[4],int n);
     
    int main( )
    {
        int score[3][4]={{65,67,79,60},{80,87,90,81},{90,99,100,98}};
        average(*score, 12);//指针数组,是一个数组,里面存的是指针
        printf("输入查询第几位同学成绩:");
        int n;
        scanf("%d",&n);
        search(score,n);
        return 0;
    }
     
    void average(int *p,int n)//这里*p其实就是指向数组的指针,也可以是p[],只不过p[]中存的是地址
    {
        int *p_end,sum=0,aver;
        
        p_end=p+n-1;
        for(;p<p_end;p++)
        {
            sum=sum+(*p);
        }
        aver=sum/n;
        printf("平均成绩是:%4d
    ",aver);
    }
     
    void search(int (*p)[4],int n)
    {
        int i;
        printf("NO.%d :",n);
        for(i=0;i<4;i++)
        {
            printf("%4d",*(*(p+n)+i));//这种有利于找第n行直接
        }
        printf("
    ");
    }
    
    追风少年
  • 相关阅读:
    ASP.NET备份还原数据库
    ASP.NET的运行原理与运行机制
    Asp.net WebPages框架运行原理浅析(转)
    不要盲目选择定时器
    C# 如何用计时器Timer控件实现停留几秒再做切换窗体的操作
    使用System.Timers.Timer类实现程序定时执行
    C#启动一个外部程序(1)-WinExec
    几种类型的db,以及最新的db排名,看一下
    SharePoint 2013 讨论板列表"Connect to Outlook" 不可用解决方案
    Java可视化编程,基于布局管理器的UI设计
  • 原文地址:https://www.cnblogs.com/lzycodinglife/p/12692312.html
Copyright © 2020-2023  润新知