请教在C语言中该如何定义使用二维动态float型数组

goldenfield 2005-11-12 04:00:03
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>

#define DA 2.0
#define DB 3.0
#define IM 30
#define JM 60
#define NPX 2
#define NPY 2

int main(int argc, char *argv[])
{
int IML,JML;
IML=IM/NPX;
JML=JM/NPY;
要实现一个随着IM、JM的值的调整而动态变化的二维float型数组u[IML+2][JML+2],
且在定义后的有关数组u的操作中,直接使用二维数组的格式u[x][y]进行相应的操作
应该如何定义?
}
...全文
927 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
FBIq 2005-11-12
  • 打赏
  • 举报
回复
我要的是理由!
lxw2118 2005-11-12
  • 打赏
  • 举报
回复
for(i=0; i<fIML; ++i) free(p[i]);
free(p);//这个需要吗?

当然需要啊~
FBIq 2005-11-12
  • 打赏
  • 举报
回复
for(i=0; i<fIML; ++i) free(p[i]);
free(p);//这个需要吗?
megaboy 2005-11-12
  • 打赏
  • 举报
回复
对某起始地址的引用,例如u[1][1],是不是&u[1][1]?
------------------------------------------------
当然可以。


C语言中內建的动态二维float型数组,又是如何实现的呢?!
-----------------------------------------------------
在是否连续这个问题上,其实是无所谓的。当然有方法可以让这些内存单元连续排列,但是,由于目前只有符合C99的编译器才能定义VLA,其它编译器只能采用这些方法来建立动态数组,无论采用哪种方法,即使具有连续的内存空间,都不是真正的数组,虽然它们都可以进行数组引用,由于无法改变伪数组这一性质,追求内存空间的连续性变得没有意义。

希望内存空间连续的话,可以这样做:

float u[iScale]; //iScale = (IML+2)*(JML+2)
float fIML = IML+2, fJML = JML+2;
float **p;
int i;
p = (float**)malloc(fIML*sizeof(float*));
for(i=0; i<fIML; ++i) p[i] = u+i*fJML;

然后就可以u[i][j]使用了。

释放的时候,free(p);就行了。

对于不连续空间的那个方法,这样释放:
for(i=0; i<fIML; ++i) free(p[i]);
free(p);
goldenfield 2005-11-12
  • 打赏
  • 举报
回复
这样的动态数组具体又该如何将申请的空间归还给系统呢?
goldenfield 2005-11-12
  • 打赏
  • 举报
回复
这么做跟内建的二维数组是不一样的,本质在于存储空间的不连续
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
C语言中內建的动态二维float型数组,又是如何实现的呢?!
goldenfield 2005-11-12
  • 打赏
  • 举报
回复
对某起始地址的引用,例如u[1][1],是不是&u[1][1]?
//说清楚点
**********************************************
比如说,我现在要将u[iIML][jJML]的第一行第一列作为起始地址,第一行第jJML-1列作为结束地址,对这jML-1个数据要进行处理时,可否用&u[1][1]作为起始地址,进行后续处理。

FBIq 2005-11-12
  • 打赏
  • 举报
回复
是++i,还是i++?
//一样
对u[i][j]进行赋初值时,可以按如下形式么?
for (i=0;i<iIML;i++)
for (j=0;j<jJML;j++)
u[i][j]=0.0;
//可以
对某起始地址的引用,例如u[1][1],是不是&u[1][1]?
//说清楚点
rwxybh 2005-11-12
  • 打赏
  • 举报
回复
float型数组,是不是应该定义为:
float **u;
int i;
int iIML, iJML;
iIML = IML+2;
iJML = JML+2;
u = (float**)malloc(iIML*sizeof(float*));
for(i=0; i<iIML; ++i) u[i] = (float*)malloc(iJML*sizeof(float));
这样就能使用u[i][j]了。
是++i,还是i++?
**************************
对u[i][j]进行赋初值时,可以按如下形式么?
for (i=0;i<iIML;i++)
for (j=0;j<jJML;j++)
u[i][j]=0.0;
**************************
对某起始地址的引用,例如u[1][1],是不是&u[1][1]?
还请多指教!!谢谢!!
==============================================================
这么做跟内建的二维数组是不一样的,本质在于存储空间的不连续
goldenfield 2005-11-12
  • 打赏
  • 举报
回复
float型数组,是不是应该定义为:
float **u;
int i;
int iIML, iJML;
iIML = IML+2;
iJML = JML+2;
u = (float**)malloc(iIML*sizeof(float*));
for(i=0; i<iIML; ++i) u[i] = (float*)malloc(iJML*sizeof(float));
这样就能使用u[i][j]了。
是++i,还是i++?
**************************
对u[i][j]进行赋初值时,可以按如下形式么?
for (i=0;i<iIML;i++)
for (j=0;j<jJML;j++)
u[i][j]=0.0;
**************************
对某起始地址的引用,例如u[1][1],是不是&u[1][1]?
还请多指教!!谢谢!!
megaboy 2005-11-12
  • 打赏
  • 举报
回复
int **u, i;
int iIML, iJML;
iIML = IML+2;
iJML = JML+2;
u = (int**)malloc(iIML*sizeof(int*));
for(i=0; i<iIML; ++i) u[i] = (int*)malloc(iJML*sizeof(int));


这样就能使用u[i][j]了。
ma100 2005-11-12
  • 打赏
  • 举报
回复
// 创建二维数组x
template <class T>
void Make2DArray( T ** &x, int rows, int cols)
{

x = new T * [rows];//创建行指针

for (int i = 0 ; i<rows; i++)//为每一行分配空间
x[i] = new int [cols];
}


// 删除二维数组x
template <class T>
void Delete2DArray( T ** &x, int rows)
{
for (int i = 0 ; i < rows ; i++)//释放为每一行所分配的空间
delete [ ] x[i];

delete [] x;//删除行指针
x = 0;
}

70,013

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧