C语言的二维指针及其动态内存分配和释放

来源:互联网 发布:拖动拼图验证码js插件 编辑:程序博客网 时间:2024/05/21 06:48
要求:
初步掌握visual studio 2015 中控制台c程序的建立。
结合课本讲解指针概念;指针上机练习。讲解动态分配和释放。一维指针动态分配和释放练习。二维指针概念讲解,二维指针动态分配和释放练习。
作业:矩阵乘法
用户输入矩阵1行数、列数,然后提示用户输入各元素;
用户输入矩阵2行数、列数,然后提示用户输入各元素;
输入后计算相乘结果矩阵。
要求:
1 自己安装Visual studio 2015. 从微软官网上下载visual studio 2015 (Community edition),然后申请序列号(免费),安装。
2.建立控制台应用程序。(上网查怎么建立)
3.使用二维指针及动态分配,完成作业,掌握指针和结构、文件的结合使用。


二维指针:int **p      p是指向(一组指向整数数据指针)的指针,是一个二维指针。在其定义过程中,编译器并不对其进行内存的分配,因此必须自己管理其内存的分配与释放。内存分配如下:
p = (int **)malloc((sizeof(int*))*m); for (i=0;i<m;i++){       p[i] = (int *)malloc(sizeof(int)*n); }
动态内存释放过程与分配相反:
for (i=0;i<m;i++){       free(p[i]); }free(p);

下面的表达是成立的:

p[i][j] = *(*(p + i) + j)

*p 表示指针p存放的内容值,在定义指针时, *只是为了声明。

#include <stdio.h>#include <malloc.h>int main(){int n1, n2, m1, m2;float **p1,**p2,**p3;//定义三个二维指针float val,valu;printf("please input the size of first matrix:");scanf_s("%dx%d", &m1, &n1);//输入第一个矩阵的行数和列数p1 = (float **)malloc(m1* sizeof(float *));//动态内存分配for (int i = 0; i < m1; i++){p1[i] = (float *)malloc(n1 * sizeof(float));}printf("please input the size of second matrix:");scanf_s("%dx%d", &m2, &n2);p2 = (float **)malloc(m2 * sizeof(float *));for (int i = 0; i < m2; i++){p2[i] = (float *)malloc(n2 * sizeof(float));}p3 = (float **)malloc(m1 * sizeof(float *));for (int i = 0; i < m1; i++){p3[i] = (float *)malloc(n2 * sizeof(float));}printf("please input the first matrix:\n");for (int i = 0; i < m1; i++){for (int j = 0; j < n1; j++){scanf_s("%f", &val);*(*(p1 + i) + j) = val;}}printf("please input the second matrix:\n");for (int i = 0; i < m2; i++){for (int j = 0; j < n2; j++){scanf_s("%f", &val);*(*(p2 + i) + j) = val;}}//矩阵乘法运算for (int i = 0; i < m1; i++){for (int j = 0; j < n2; j++){valu = 0;for (int k = 0;k < m1; k++){valu += p1[i][k] * p2[k][j];}*(*(p3 + i) + j) = valu;}}//矩阵输出printf("output matrix1 is:\n");for (int i = 0; i < m1; i++){for (int j = 0; j < n1; j++){printf("%f ", *(*(p1 + i) + j));}printf("\n");}printf("output matrix2 is:\n");for (int i = 0; i < m2; i++){for (int j = 0; j < n2; j++){printf("%f ", *(*(p2 + i) + j));}printf("\n");}//输出计算结果printf("output matrix is:\n");for (int i = 0; i < m1; i++){for (int j = 0; j < n2; j++){printf("%f ", *(*(p3 + i) + j));}printf("\n");}//释放动态内存空间for (int i = 0; i < m1; i++){free(*(p1+i));}free(p1);for (int i = 0; i < m2; i++){free(p2[i]);}free(p2);for (int i = 0; i < m1; i++){free(p3[i]);}free(p3);getchar();//暂停,输入回车结束getchar();return 0;}




阅读全文
0 0