一维数组是指针,可将二维数组看作是指针的指针:每一行是一个一维数组,而列是指向行的指针。在动态创建时,先分配指向行的指针空间,再循环维每一行申请空间。
#include
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
p[i] = new int [y];
}
//赋值,
k=0;
for(i=0;i
for(n=0;n
p[i][n] = k;
k++;
}
}
//显示刚才的赋值
for(i=0;i
for(n=0;n
cout << p[i][n] << "\t";
}
cout << endl;
}
//删除刚才申请的内存
for(i=0;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()分配的,位于内存的堆区中,并且该对象未命名。
需要使用动态内存分配
目前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);
}
设两个变量,譬如X,Y为中间变量,存储二维数组的首地址,用指针进行值修改
这样貌似是不可以的~~~
数组定义的时候下标必须是常量,而且定义后大小就不能变了~~
因为在编译的时候就要为数组分配规定的内存空间了~~~
你可以去试试,这样是不可以的~~~编译不能通过~~
这个要用动态分配
用new.
int a, b;
cin<int *p
p=new int[a][b];
int func(int *p)
{
……
}
你看看这样可以不
不过记得要自己释放分陪的内存。