qq_20614949 2023-03-17 09:19 采纳率: 19.1%
浏览 14
已结题

为什么主函数中SUM=..调用函数的时候数组a传递不了到子函数中

#include<iostream>
using namespace std;
int listSum( const int(*p)[4],int n);
int main()
{
    int m,i,j,SUM,q;
     int a[i][4]; 
     int (*p)=a[i];
    cout<<"请输入数的总个数(4的倍数)"<<endl;
    cin>>m;
    cout<<"请输入这些数的具体值"<<endl;
    for(i=0;i<m/4;i++){
        for(j=0;j<4;j++){
        cin>>a[i][j];
        }        
    }     
    cout<<"将这些数变为四列的二维数组为"<<endl;
    for(i=0;i<m/4;i++){
        for(j=0;j<4;j++){
            cout<<a[i][j]<<'\t';
        }
        cout<<endl;
    }
    q=m/4;
    SUM=listSum(a[q][4],q);
    cout<<"这些数的和为"<<SUM;
}
int listSum(  int(*p)[4],int n)
{
    int sum=0;
    int i,j;
    for(i=0;i<n;i++){
        for(j=0;j<4;j++){
            sum+=*(p+i)[j];
            
        }
    }
    
}

为什么主函数中SUM=..调用函数的时候数组a传递不了到子函数中
``
  • 写回答

4条回答 默认 最新

  • 「已注销」 2023-03-17 09:21
    关注

    参考GPT和自己的思路:

    你的代码存在一些问题。首先,在第6行的时候,你给定了变量i的值,但是并没有给定其初始值,这会导致数组a没有被正确地初始化。其次,在第8行你使用了a[i],但是在这一行之前根本没有给i赋值,这会导致指针p指向错误的地址,也就是数组a的一个随机位置。在第25行中,你传递了一个空指针给listSum函数,因为a[q][4]实际上是a数组中一个不存在的位置。因此,你需要做一些更改来修复这些问题。

    以下是你需要做出的更改:

    1. 在第6行声明变量i之前,先通过cin输入其初始值。

    2. 在第7行中,将数组a的声明移动到i的声明之后,并将数组大小更改为m/4 x 4。

    3. 在第8行中,将a[i]更改为&a[0],因为一维数组在传递给函数时会自动转换为指向该数组首元素的指针。

    4. 在第25行中,将a[q][4]更改为&a[0]。

    下面是更改后的代码:

    1. #include<iostream>
    2. using namespace std;
    3. int listSum( const int(*p)[4],int n);
    4. int main()
    5. {
    6. int m,i=0,j,SUM,q;
    7. cout<<"请输入数的总个数(4的倍数)"<<endl;
    8. cin>>m;
    9. int a[m/4][4];
    10. int (*p)=&a[0];
    11. cout<<"请输入这些数的具体值"<<endl;
    12. for(i=0;i<m/4;i++){
    13. for(j=0;j<4;j++){
    14. cin>>a[i][j];
    15. }
    16. }
    17. cout<<"将这些数变为四列的二维数组为"<<endl;
    18. for(i=0;i<m/4;i++){
    19. for(j=0;j<4;j++){
    20. cout<<a[i][j]<<'\t';
    21. }
    22. cout<<endl;
    23. }
    24. q=m/4;
    25. SUM=listSum(&a[0],q);
    26. cout<<"这些数的和为"<<SUM;
    27. }
    28. int listSum( int(*p)[4],int n)
    29. {
    30. int sum=0;
    31. int i,j;
    32. for(i=0;i<n;i++){
    33. for(j=0;j<4;j++){
    34. sum+=*(p[i]+j);
    35. 
    36. }
    37. }
    38. return sum;
    39. }
    

    在更改后的代码中,数组a被正确地传递给了listSum函数,并且程序能够正确地计算出输入数组的和。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 3月25日
  • 已采纳回答 3月17日
  • 创建了问题 3月17日

悬赏问题

  • ¥30 vb net 使用 sendMessage 如何输入鼠标坐标
  • ¥200 求能开发抖音自动回复卡片的软件
  • ¥15 关于freesurfer使用freeview可视化的问题
  • ¥100 谁能在荣耀自带系统MagicOS版本下,隐藏手机桌面图标?
  • ¥15 求SC-LIWC词典!
  • ¥20 有关esp8266连接阿里云
  • ¥15 C# 调用Bartender打印机打印
  • ¥15 我这个代码哪里有问题 acm 平台上显示错误 90%,我自己运行好像没什么问题
  • ¥50 C#编程中使用printDocument类实现文字排版打印问题
  • ¥15 找会编程的帅哥美女 可以用MATLAB里面的simulink编程,用Keil5编也可以。