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;
}