为什么不摆烂 发表于 2022-12-6 22:45:31

函数指针和二位数组

#include <stdio.h>
#include <stdlib.h>

//两个求和函数的声明
int sumbyrow(int (*arr),int row,int sum);
int sumbycol(int (*arr),int col,int sum);
//函数定义在一定程度上有函数原型声明的作用.
//当函数定义在后,而调用在前时则必须要在调用语句之前声明该函数。
//若调用该函数在定义之后则可以不用单独给出声明。

int main()
{
        int dataTable = { 0 };//定义数据表,初始化数据表
        int i,j;
        printf("录入数据中...");
        for(i = 0;i < 5;i++)
        {
                for(j = 0;j < 4;j++)
                        dataTable = i * 4 + j;
        }
        printf("录入完毕\n");
        int(*p) =dataTable;       //定义数组指针,指向二维数组datatable
        printf("输出数据\n");
        for(i = 0;i < 5; i++)
        {
                for(j = 0;j < 4; j++)
                        printf("\t%d",*(*(p + i) + j));
                printf("\n");
        }
       
        int select,pos,sum;   //定义求和方式,行/列,和
        int(*q)(int,int,int);
        //求和计算
        printf("请输入求和方式(行:0/列:1):");
        scanf("%d",&select);
        printf("选择行/列:");
        scanf("%d",&pos);
        if (select == 0)
        {
                printf("按行求和,第%d数据",pos);
                q=sumbyrow;

        }
        else if (select == 1)
        {
                printf("按行求和,第%d列数据",pos);
                q=sumbycol;
       
        }
        (*q)(dataTable,pos,sum);
        printf("求和结果为:%d\n",sum);
        system("pause");
        return 0;
}

//按行求和
int sumbyrow (int (*arr),int row,int sum)
{
        int i = 0;
        sum = 0;
        for(i = 0;i < 4; i++)
                sum += *(*(arr + row-1) + i);
                return sum;
}

//按列求和
int sumbycol (int (*arr),int col,int sum)
{
        int i = 0;
        sum = 0;
        for(i = 0;i < 5; i++)
                sum += *(*(arr + i) + col-1);
                return sum;
}
程序能够正常运行,但是我输入列数之后求出来的和是0,书上的代码是把sum当作地址传过去然后在求和函数的形参定义一个指针sum,但是我直接想把sum当作变量传过去却求和出来的结果是0

jhq999 发表于 2022-12-6 23:28:25

本帖最后由 jhq999 于 2022-12-6 23:31 编辑

实参不随形参改变而改变,实参和形参是两个变量,除了形参的初值是实参赋予的,它们之间没有联系
printf("求和结果为:%d\n",(*q)(dataTable,pos,sum));
页: [1]
查看完整版本: 函数指针和二位数组