实现一个函数PrintSum能够打印二维数组指定区间内的各行之和

实现一个函数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,自己运行看一下,会加深理解,加油奥利给!
很高兴可以帮助到你!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值