欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C语言:二维数组与指针 实践1

程序员文章站 2022-07-07 11:52:06
...

任务代码:

【项目1-二维数组当函数参数】
定义一个函数来完成对参数数组中元素的求和工作,函数声明如下:

int sum(int array[ ][4],int m,int n);  //该函数完成对array数组中的前m行和n列元素求和  
在以下程序的基础上,完成对sum函数的定义。
#include <stdio.h>  
int sum(int array[ ][4],int m,int n);//该函数完成对array数组中的前m行和n列元素求和  
int main()  
{  
    int a[4][4]= {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}}; //定义二维数组的同时进行初始化  
    int row,col;  
    scanf("%d %d", &row, &col); //输入行数和列数  
    printf("%d\n", sum(a, row, col)); //输出二维数组前row行前col列的元素的和  
    return 0;  
}  

自己的答案:

(1)指向二维数组元素的指针

#include <stdio.h>

int sum(int array[ ][4],int m,int n);//该函数完成对array数组中的前m行和n列元素求和

int main()
{
    int a[4][4]= {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}}; //定义二维数组的同时进行初始化
    int row,col;
    printf("请输入行列:");
    scanf("%d %d", &row, &col); //输入行数和列数
    printf("%d\n", sum(a, row, col)); //输出二维数组前row行前col列的元素的和
    return 0;
}

//指向二维数组元素的指针
int sum(int a[][4],int m,int n)
{
    int sum=0;
    int *p;
    int *p_end=a[0]+((m-1)*4+(n-1));
    
    for(p=a[0];p<=p_end;p++)
    {
        sum+=*p;
    }
    return sum;
}

(2)数组指针法:指向一维数组的指针变量

#include <stdio.h>

int sum(int array[ ][4],int m,int n);//该函数完成对array数组中的前m行和n列元素求和

int main()
{
    int a[4][4]= {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}}; //定义二维数组的同时进行初始化
    int row,col;
    printf("请输入行列:");
    scanf("%d %d", &row, &col); //输入行数和列数
    printf("%d\n", sum(a, row, col)); //输出二维数组前row行前col列的元素的和
    return 0;
}

//数组指针
int sum(int(*p)[4],int m,int n)
{
    int sum=0;
    int i,j;
    for(i=0;i<m;i++)//用于计算行数
    {
        for(j=0;j<n;j++)//用于计算列数
        {
            sum+=*(*(p+i)+j);//p指向一维整体,p+i指向行,*(p+i)指向列,*(*(p+i)+j)指向元素
        }
    }
    return sum;
}

(3)相同写法2:

#include <stdio.h>

int sum(int array[ ][4],int m,int n);//该函数完成对array数组中的前m行和n列元素求和

int main()
{
    int a[4][4]= {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}}; //定义二维数组的同时进行初始化
    int row,col;
    printf("请输入行列:");
    scanf("%d %d", &row, &col); //输入行数和列数
    printf("%d\n", sum(a, row, col)); //输出二维数组前row行前col列的元素的和
    return 0;
}

//数组指针
int sum(int(*p)[4],int m,int n)
{
    int sum=0;
    int i,j;
    for(i=0;i<m;i++,p++)//用于计算行数
    {
        for(j=0;j<n;j++)//用于计算列数
        {
            sum+=*(*p+j);//p指向一维整体,p+i指向行,*(p+i)指向列,*(*(p+i)+j)指向元素
        }
    }
    return sum;
}


(4)指针数组

#include <stdio.h>

int sum(int array[ ][4],int m,int n);//该函数完成对array数组中的前m行和n列元素求和

int main()
{
    int a[4][4]= {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}}; //定义二维数组的同时进行初始化
    int row,col;
    printf("请输入行列:");
    scanf("%d %d", &row, &col); //输入行数和列数
    printf("%d\n", sum(a, row, col)); //输出二维数组前row行前col列的元素的和
    return 0;
}

//数组指针
int sum(int a[][4],int m,int n)
{
    int sum=0;
    int i,j;
    int *pb[4];
    
    pb[0]=a[0];//pb[0]储存a[0]行一维数组首元素a[0][0]地址,*pb指向a[0]首元素
    pb[1]=a[1];//pb[1]储存a[1]行一维数组首元素a[1][0]地址,*pb指向a[1]首元素
    pb[2]=a[2];
    pb[3]=a[3];
    
    for(i=0;i<m;i++)//用于计算行数
    {
        for(j=0;j<n;j++,pb[i]++)//用于计算列数
        {
            sum+=*pb[i];
        }
    }
    return sum;
}


答案解法:

#include <stdio.h>  
int sum(int array[ ][4],int m,int n);//该函数完成对array数组中的前m行和n列元素求和  
int main()  
{  
    int a[4][4]= {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}}; //定义二维数组的同时进行初始化  
    int row,col;  
    scanf("%d %d", &row, &col); //输入行数和列数  
    printf("%d\n", sum(a, row, col)); //输出二维数组前row行前col列的元素的和  
    return 0;  
}  
  
int sum(int array[ ][4],int m,int n)  
{  
    int s=0;  
    int i,j;  
    for(i=0; i<m; ++i)  
        for(j=0; j<n; ++j)  
            s+=array[i][j];  
    return s;  
}