实现一个函数PrintSum,能够打印二维数组指定区间内的各行之和。
需求定义是可以输入一个定额的二维数组,能够打印二维数组的指定区间内各行的和:
#include<stdio.h>
void PrintSum(int (*p1)[20], int (*p2)[20], int m);//定义需要的二维数组原型
int main() {
int n, m, i, j, a[20][20];
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++)
for (j = 0; j < m; j++)
scanf("%d", &a[i][j]);
int (*p)[20] = a; //定义二维数组指针
while (scanf("%d%d", &i, &j) != EOF) {
PrintSum(p + i, p + j, m);
}
return 0;
}
//实现该原型
void PrintSum(int (*p1)[20], int (*p2)[20], int m) {
int i = 0, j;
// printf("p1+i is:%d\n", p1);
// printf("p2+j is:%d\n", p2);
// printf("the num is:%lld\n", p2 - p1);
// printf("m is %d\n", m);
// printf("p1 is :%d\n", *(*p1));
// printf("p2 is :%d\n", *(*p2));
// printf("p1->next is :%d\n", *(*(p1+2)));
// printf("p1->next->next is :%d\n", *(*p1) + 2);
// printf("p[0][0]:%d\n", p1[0][0]);
// printf("p2[1][0]:%d\n", p1[1][0]);
for (; i <= p2 - p1; i++) {
int sum = 0; //此处定义使得每次打印不会累加
for (j = 0; j < m; j++) {
//二维数组指针指向数组元素第一个值
//*(*(p1 + i))指向自p1行后第i行的地址,不懂的话可以将打印地址放开进行查看 代表的是行地址
//比较有趣的来了:*(*(p1 + i)) + j 代表的是列地址
sum += *(*(p1 + i)) + j;
}
printf("the sum is :%d\n", sum);
}
}
好多同学玩不懂指针,其实,指针我借用一个java中代理proxy的概念来解释一下:
1.C语言中,每个变量都有一个在内存内存储的变量地址 ,用&取地址符可以查看到一个类似于0x000ff00 这样的一个16进制的虚地址编址,这就类似于房子的地址,什么小区几栋几零几这种,p = &a则是将你的地址交给代理商(指针)
2.而指针p你可以想象为租房子的代理商,其拥有房子的地址,且可以将号看做是你房子的钥匙,*p则可以获取到其代理的房子中的数据
这就是指针
二维数组的存储也属于线性存储,其指向的是数组首地址的位置,通过操纵指针的移动进行数组的遍历:
#include<stdio.h>
int main() {
int a[3][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
int (*p)[3] = a;
printf("p is %d\n", *p);
printf("*p is %d\n", *(*p));
printf("*(*(p+1))is %d\n", *(*(p + 1)));
printf("*(*(p+1))+1 is %d\n", *(*(p + 1)) + 1);
}
其中p指向的是数组的第一个值:1的地址,使用*(p)则可以取到第一行第一列的值1,而((p + 1)))取到的是第二行第一个值4,而(*(p + 1)) + 1取到的是第二行第二个值5,自己运行看一下,会加深理解,加油奥利给!
很高兴可以帮助到你!!!