多维数组

基本常识
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("
");
}
追风少年
原文地址:https://www.cnblogs.com/lzycodinglife/p/12692312.html