未解决问题:指针作参数、二重指针、指针数组、动态内存分配

题目:输入m个学生n门课的成绩,计算每个学生的平均成绩,输入学生编号后输出该学生各门课的成绩。

先直接上源码:(有错误的源码)

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

 int **pointer_counterpart = NULL;

int main()
{
    void Input_number(int *m, int *n);              //输入m个学生n门课成绩
    void allocation(int m, int n);
    //void display(int **pointer, int m, int n);
    void calculation(int **pointer, int m, int n);   //计算平均成绩
    void Search(int **pointer, int m, int n);        //查询学生成绩
    void Free(int **pointer, int m);

    int students_number, subjects_number;

    Input_number(&students_number, &subjects_number);
    allocation(students_number, subjects_number);
    //display(pointer_counterpart, students_number, subjects_number);
    calculation(pointer_counterpart, students_number, subjects_number);
    Search(pointer_counterpart, students_number, subjects_number);
    Free(pointer_counterpart, students_number);
    return 0;
}
void Input_number(int *m, int *n)
{
    printf ("Please input the numbers of students and subjects:\n");
    scanf ("%d%d", m, n);
}
void allocation(int m, int n)
{
    int *pointer[m];

    for (int i = 0; i < m; ++i) {
        pointer[i] = (int*)malloc(n * sizeof(int));
    }
    for (int i = 0; i < m; ++i) {
         printf ("Please input %d students %d grades:\n ", i + 1, n);
          for (int j = 0; j < n; ++j) {
            scanf ("%d", *(pointer + i) + j);
        }
    }
    /**完整运行完成后再回来看这里
    for (int i = 0; i < m; ++i) {
         pointer[i] = (int*)malloc(n * sizeof(int));
         printf ("Please input %d students %d grades:\n ", i + 1, n);
          for (int j = 0; j < n; ++j) {
            scanf ("%d", *(pointer + i) + j);
        }
    }*/

    /*print to try
    for (int i = 0; i < m; ++i) {
        printf ("The %d student‘s grades are:\n", i + 1);
        for (int j = 0; j < n; ++j) {
            printf ("%d ", *(*(pointer + i) + j));
        }
        printf ("\n");
    }right****/
    pointer_counterpart = pointer;
}
/*
void display(int **pointer, int m, int n)
{
    printf ("Matrix:\n");
    for (int i = 0; i < m; ++i) {
        for (int j = 0; j < n; ++j) {
            printf ("%d ", *(*(pointer + i) + j));
        }
        printf ("\n");
    }
}*/
void calculation(int **pointer, int m, int n)
{
    int average;
    int sum;
    ///print to try
    printf ("%p  %p\n", pointer_counterpart, *pointer_counterpart);
    printf ("%p  %p\n", pointer, *pointer);
    ///end
    for (int i = 0; i < m; ++i) {
        sum = 0;
        average = 0;
        for (int j = 0; j < n; ++j) {
            sum += *(*(pointer + i) + j);   ///学生数 = 3, 科目数 = 3时此处算第三个平均数有错误
        }
        average = sum / n;
        printf ("%d students‘ average is %d.\n", i + 1, average);
    }
}
void Search(int **pointer, int m, int n)
{
    int num;
    bool condition = true;
    while (condition) {
        printf ("Please input the student‘s number to search his grades:\n");
        scanf ("%d", &num);
        if (num < 1 || num > m) {
            char flag;
            printf ("ERROR, reinput ‘y‘, exit ‘n‘:");
            scanf ("%c", &flag);
            if (flag == ‘n‘ || flag == ‘N‘) {
                condition = false;
                break;
            }
            else  {
                condition = true;
                break;
            }
        }
        else {
            printf ("The %d students‘ grades are:\n", num);
            for (int i = 0; i < n; ++i) {
                //printf ("%p\n", *pointer);
                printf ("%d ", *(*(pointer + num - 1) + i));
                ///printf ("%d ", *(*(pointer_counterpart + num - 1) + i));///此处输出仍然有错误
            }
            printf ("\n");
            condition = false;
        }
    }

}
void Free(int **pointer, int m)
{
    for (int i = 0; i < m; ++i) {
        free (*(pointer + i));
        *(pointer + i) = NULL;
    }
}

第一个未解决问题:在allocation函数中动态内存分配问题

void allocation(int m, int n)
{
    int *pointer[m];

    for (int i = 0; i < m; ++i) {
        pointer[i] = (int*)malloc(n * sizeof(int));
    }
    for (int i = 0; i < m; ++i) {
         printf ("Please input %d students %d grades:\n ", i + 1, n);
          for (int j = 0; j < n; ++j) {
            scanf ("%d", *(pointer + i) + j);
        }
    }
    /**上面使用一个for先把指针数组内存分配好后,然后两个for循环输入数据是成功的。但是当如下这种分配赋值方式就有错误,错误就是在函数calculation中,当
    学生数 = 3, 科目数 = 3时,算第三个平均数有错误,calculation完整源码有标示,中至今没找出哪里有错误来。。。
    for (int i = 0; i < m; ++i) {
         pointer[i] = (int*)malloc(n * sizeof(int));
         printf ("Please input %d students %d grades:\n ", i + 1, n);
          for (int j = 0; j < n; ++j) {
            scanf ("%d", *(pointer + i) + j);
        }
    }有错误的*/

    /*print to try
    for (int i = 0; i < m; ++i) {
        printf ("The %d student‘s grades are:\n", i + 1);
        for (int j = 0; j < n; ++j) {
            printf ("%d ", *(*(pointer + i) + j));
        }
        printf ("\n");
    }right 尝试上面输入是否正确,结果没问题****/
    pointer_counterpart = pointer;
}

第二个未解决问题:

void Search(int **pointer, int m, int n)
{
    int num;
    bool condition = true;
    while (condition) {
        printf ("Please input the student‘s number to search his grades:\n");
        scanf ("%d", &num);
        if (num < 1 || num > m) {
            char flag;
            printf ("ERROR, reinput ‘y‘, exit ‘n‘:");
            scanf ("%c", &flag);
            if (flag == ‘n‘ || flag == ‘N‘) {
                condition = false;
                break;
            }
            else  {
                condition = true;
                break;
            }
        }
        else {
            printf ("The %d students‘ grades are:\n", num);
            for (int i = 0; i < n; ++i) {
                //printf ("%p\n", *pointer);
                printf ("%d ", *(*(pointer + num - 1) + i));
                ///printf ("%d ", *(*(pointer_counterpart + num - 1) + i));///此处输出仍然有错误,当指针数组的地址传进来以后此处就是不对,脑袋要炸。。
            }
            printf ("\n");
            condition = false;
        }
    }

}
时间: 2024-08-04 14:41:19

未解决问题:指针作参数、二重指针、指针数组、动态内存分配的相关文章

指针做参数的动态内存分配与二重指针(上)

C中的动态内存分配问题: 格式:Int *pointer; Pointer = (int *)malloc(100 * sizeof(int)); 可以在被调用函数(该函数返回指针的函数)中动态分配内存,(并且该内存是分配在堆内存中的,故而被调函数可以返回指向该堆内存的指针),然后返回该指针值,该指针指向动态分配的内存,然后可以在主函数中free掉pointer.哪怕在主函数中将该指针值赋值给pointer_2,free掉pointer_2也是可以的,(可以理解的,它们都指向该堆内存),以避免出

C和指针 (pointers on C)——第十一章:动态内存分配(上)

第十一章 动态内存分配 数组在声明的时候,本身作为一个指针常量,它在编译时候内存就已经被分配好了.但是有时候程序不知道这个数组到底有多长,所以,为了防止内存的浪费,C提供了动态内存分配的策略. 其实,作为独立的一章,本章显得内容不多.malloc,free,calloc,realloc就没有了,但是它包含很多用法,也有很多陷阱. 总结: malloc和calloc函数都用于动态分配一块内存,并返回一个指向该块内存的指针.malloc返回的是一个 void *的指针. malloc的参数就是需要分

C和C指针小记(十六)-动态内存分配

动态内存分配 1.1 为什么使用动态内存分配 直接声明数组的方式的缺点: 1) 声明数组必须指定长度限制.无法处理超过声明长度的数组. 2) 如果声明更大的常量来弥补第一个缺点,会造成更多的内存浪费. 3)如果输入数组的数据超过来数组的容纳范围,程序必须以一种合理的方式作出响应.但是程序员一般不会做这个判断. 1.2 malloc 和 free malloc 和 free 分别用于执行动态分配内存和释放. stdlib.h 中声明来这两个函数的原型 void malloc( size_t siz

指针 &amp;&amp; 动态内存分配

C++中的动态内存分配机制 c++中使用new和delete来完成在堆上对动态内存的分配和释放. 注.所有指针都应该被初始化 如果指针指向的动态内存被释放或没有指向合法的地址,就应该将指针设置为nullptr,否则内存泄漏. 变量: double* pvalue {}; pvalue=new double; *pvalue=9.0; 或 double* pvalue {}; pvalue=new double {9.0}; 或合并为一句 double* pvalue {new double{9.

动态内存分配与指向它的指针变量

1.动态内存分配的含义 c语言允许建立动态内存分配区域,以存放一些临时用的数据,这些数据不必再程序的声明部分定义,也不必等到函数结束时才释放,而是要随时开辟,不需要随时释放,这些数据是临时存放在一个特定的自由存储区(堆),可以根据需要向系统申请所需要大小的空间,由于未在声明部分定义它们为变量或数组,因此不能通过变量名或数组名去引用这些数据,只能通过指针来引用. 2.建立内存的动态分配 对内存的动态分配是通过系统提供的函数库来实现的,主要有malloc,calloc,free,realloc这四个

C++学习笔记(十一):void*指针、类型转换和动态内存分配

void*指针 void关键字表示“空类型”的概念.但是,这里的“空类型”不表示“任意类型”,而是表示不存在的意思,也就是说C/C++不允许你写语句void a,不存在类型为void的东西. void*表示“空类型指针”,与void不同,void*表示“任意类型的指针”或表示“该指针与一地址值相关,但是不清楚在此地址上的对象的类型”. 类型转换 C风格转换: 1 int i; 2 double d; 3 4 i = (int) d; 5 //或 6 i = int (d); C风格转换在C++中

第17周项目2--引用作行参(三数排序(指针作参数))

/* * Copyright (c) 2014, 烟台大学计算机学院 * All rights reserved. * 文件名称:test.cpp * 作 者:刘畅 * 完成日期:2014 年 12 月 17 日 * 版 本 号:v1.0 * * 问题描述:设计一个程序,输入三个整数,将其从大到小的顺序输出,要求 (1)排序功能通过函数实现,三个整数用三个变量,不必定义数组: (2)写出两个版本的函数,一个采用传地址值的方法,另一个采用引用类型作参数. * 输入描述:三个整数, * 程序输出:将

指针做参数的动态内存分配与二重指针(下)

要实现指针作为函数形参,改变实参指针的值.一般有两种做法: 使用双指针,或者指针数组形式作为形参,将实参的地址传入函数,也即要给形参传入指针的地址! http://blog.csdn.net/liuyajun2013/article/details/17151309#0-tsina-1-79483-397232819ff9a47a7b7e80a40613cfe http://www.cnblogs.com/heat-man/p/4646051.html http://www.jb51.net/a

C和指针 (pointers on C)——第十一章:动态内存分配(下)习题

1.编写calloc,内部用malloc. void *calloc (size_t n, size_t size) { char * memory; memory =(char*) malloc(n * size); while( memory != NULL) { char * ptr; ptr = memory; while ( --n >= 0) { *ptr++ = '\0'; } } return memory; } 2.编写一个函数,动态存储一列输入的整数. #include <