如何在某个c++函数里输入一个大小待定的二维数组?

该数组的两个维度由用户输入(使用cin)。例如函数int func的一个argument是数组int arr[a][b],其中a,b需要用户输入。也就是说,要写成int func(int arr[a][b])这个类型的内容。但是现在不知道具体的格式,望赐教。

一维数组是指针,可将二维数组看作是指针的指针:每一行是一个一维数组,而列是指向行的指针。在动态创建时,先分配指向行的指针空间,再循环维每一行申请空间。
#include <iostream>

using namespace std;

int main()
{
//[3]4] //三行四列的二维数组
int x,y;
int i,n,k;
x=3;
y=4;

int **p;

p = new int*[x]; //行 //申请行的空间
//每行的列申请空间
for(i=0; i<x;i++)
{
p[i] = new int [y];
}

//赋值,
k=0;
for(i=0;i<x;i++)
{
for(n=0;n<y;n++)
{
p[i][n] = k;
k++;
}
}

//显示刚才的赋值
for(i=0;i<x;i++)
{
for(n=0;n<y;n++)
{
cout << p[i][n] << "\t";
}
cout << endl;
}

//删除刚才申请的内存
for(i=0;i<x;i++)
{
delete [] p[i];
}

delete [] p;

return 0;
今天归纳总结了一下,希望以后的朋友可以少走些弯路:)
一 :关于指针和堆的内存分配
先来介绍一下指针 : 指针一种类型,理论上来说它包含其他变量的地址,因此有的书上也叫它:地址变量。既然指针是一个类型,是类型就有大小,在达内的服务器上或者普通的PC机上,都是4个字节大小,里边只是存储了一个变量的地址而已。不管什么类型的指针,char * ,int * ,int (*) ,string * ,float * ,都是说明了本指针所指向的地址空间是什么类型而已,了解了这个基本上所有的问题都好象都变的合理了。

在C++中,申请和释放堆中分配的存贮空间,分别使用new和delete的两个运算符来完成:
指针类型 指针变量名=new 指针类型 (初始化);
delete 指针名;
例如:1、 int *p=new int(0);
它与下列代码序列大体等价:
2、int tmp=0, *p=&tmp;
区别:p所指向的变量是由库操作符new()分配的,位于内存的堆区中,并且该对象未命名。
温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2016-11-03
需要使用动态内存分配

目前c++不支持动态数组
int a,b;
int main(){

cin>>a>>b;
int *p=new int[a*b]//不能写成int[a][b]

}

int func(int arr[])
{
int k,i;
//如果你想调用arr[k][i]就要写成arr[a*k+i]
}
退出程序前要记得delete []p;

或者你使用一个类来保存数据程序可以自动调用析构函数.
class array_{
private :
int *p;
int row;
public:
array_(){p=new int[1*1];row=1;}
array_(int x,int y){p= new int[x*y];row=y;}
~array_(){delete[] p;}
int* getp(){return p;}
int getval(int x,int y){return a[x*row+y]; }
int setval(int x,int y,int val){return a[x*row+y]=val;}
};
int a,b;
int main(){

cin>>a>>b;
array_ arrk(a,b);
fun(arrk.get());
}

int func(int arr[])
{
int k,i;
//如果你想调用arr[k][i]就要写成arr[a*k+i]
}
int funclass(array_ arr;)
{
int k,i;
//如果你想调用arr[k][i]就要写成arr.getval(k,i);
}本回答被提问者采纳
第2个回答  2009-09-21
设两个变量,譬如X,Y为中间变量,存储二维数组的首地址,用指针进行值修改
第3个回答  2009-09-21
这样貌似是不可以的~~~
数组定义的时候下标必须是常量,而且定义后大小就不能变了~~
因为在编译的时候就要为数组分配规定的内存空间了~~~
你可以去试试,这样是不可以的~~~编译不能通过~~
第4个回答  2009-09-21
这个要用动态分配
用new.

int a, b;
cin<<a<<b;
int *p
p=new int[a][b];

int func(int *p)
{
……
}

你看看这样可以不

不过记得要自己释放分陪的内存。
相似回答