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

要求:
初步掌握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;
}




  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值