【学习C++】创建动态⼆维数组
1  int **a=new int*[l];a[i]=new int[l];
#include <iostream>
using namespace std;
//int l=2;
int main()
{
int l,i,j;
cout<<"l"<<endl;
cin>>l;
int **a=new int*[l];
for(i=0;i<l;i++)
a[i]=new int[l];
for(i=0;i<l;i++)
{
for(j=0;j<l;j++)
{
cout<<"a["<<i<<"]"<<"["<<j<<"]"<<"=";
cin>>a[i][j];
}
}
for(i=0;i<l;i++)
for(j=0;j<l;j++)
{
cout<<"a["<<i<<"]"<<"["<<j<<"]"<<"=";
cout<<a[i][j]<<endl;
}
return 0;
}
1.1  int a; int* a; int** a; int (*a)[10]; int (*a)(int)区别?
a) int a;表⽰⼀个内存空间,这个空间⽤来存放⼀个整数(int);
b) int* a;表⽰⼀个内存空间,这个空间⽤来存放⼀个指针,这个指针指向⼀个存放整数的空间,即a)中提到的空间;
c) int** a;表⽰⼀个内存空间,这个空间⽤来存放⼀个指针,这个指针指向⼀个存放指针的空间,并且指向的这个空间中的指针,指向⼀个整数。也简单的说,指向了⼀个b)中提到的空间;
d) int (*a)[10];表⽰⼀个内存空间,这个空间⽤来存放⼀个指针,这个指针指向⼀个长度为10、类型为int的数组;和int** a的区别在于,++、+=1之后的结果不⼀样,其他⽤法基本相同。
以上四种类型见上图表⽰。
e) int (*a)(int);表⽰⼀个内存空间,这个空间⽤来存放⼀个指针,这个指针指向⼀个函数,这个函数有⼀个类型为int的参数,并且函数的返回类型也是int。
1.2C++中动态分配输⼊长度的⼆维数组
C++中动态分配输⼊长度的⼆维数组
我知道的有这样的⽅法:
//先声明⼀个⼆维指针
int **p = new int*[a];
for(int i = 0; i < a; i++) {
p[i] = new int[];
}
这应该算c语⾔
c++应该是这样的
vector<vector<int> > m
2
//way2
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
int **newarr2d(int rows,int cols) {
int **p,i;
p=(int **)malloc(rows*sizeof(int *));
if (NULL==p) exit(1);
for (i=0;i<rows;i++) {
p[i]=(int *)malloc(cols*sizeof(int));
if (NULL==p[i]) exit(1);
}
return p;
}
void deletearr2d(int **p,int rows) {
int i;
for (i=0;i<rows;i++) {
free(p[i]);
}
free(p);
}
int main() {
int **arr2d,i,j,r,c;
r=4;
c=5;
//在堆中开辟⼀个4×5的⼆维int数组
arr2d=newarr2d(r,c);
for (i=0;i<r;i++) {
for (j=0;j<c;j++) {
arr2d[i][j]=i*c+j;
}
}
for (i=0;i<r;i++) {
for (j=0;j<c;j++) {
printf(" %2d",arr2d[i][j]);
}
}
c语言二维数组表示方法printf("\n");
}
deletearr2d(arr2d,r);
r=6;
c=3;
//在堆中开辟⼀个6×3的⼆维int数组
arr2d=newarr2d(r,c);
for (i=0;i<r;i++) {
for (j=0;j<c;j++) {
arr2d[i][j]=i*c+j;
}
}
for (i=0;i<r;i++) {
for (j=0;j<c;j++) {
printf(" %2d",arr2d[i][j]);
}
printf("\n");
}
deletearr2d(arr2d,r);
return 0;
}
//  0  1  2  3  4
//  5  6  7  8  9
// 10 11 12 13 14
// 15 16 17 18 19
//  0  1  2
//  3  4  5
//  6  7  8
//  9 10 11
// 12 13 14
// 15 16 17
/
/
2.1 malloc
int **p=NULL,i=0;
p=(int **)malloc(sizeof(int *)*SIZE);
for(;i<SIZE;i++)
{
*(p+i)=(int *)malloc(sizeof(int )*4);
}
malloc函数是在stdlib.h⽂件中,c的标准库中并没有malloc.h
malloc是⽤来动态分配内存,是向系统申请在堆上分配内存的。
要理解何时使⽤malloc,你需要了解程序的栈空间和堆空间的区别才⾏
3
blog.csdn/u014546553/article/details/53644898实例代码
//way3LZ:以下代码可以满⾜你的要求,注意:最后⼀⾏输⼊Ctrl-z表⽰输⼊结束#include <iostream>
#include <sstream>
#include <vector>
#include <string>
using namespace std;
void input_vector (vector<vector<int> >&);
int main ()
{
vector<vector<int> > vec;
input_vector (vec);
vector<vector<int> >::iterator it = vec.begin ();
for (; it != d (); ++it) {
vector<int>::iterator i = it->begin ();
while (i != it->end ()) {
cout << *i++ << " ";
}
cout << endl;
}
return 0;
}
void input_vector (vector<vector<int> >& vec)
{
vector<int> v;
while (!f()) {
int tmp(0);
v.clear ();
string line;
getline(cin, line);
istringstream ss(line);
while (ss>>tmp) {
v.push_back (tmp);
}
vec.push_back (v);
}
}
1、⽤new申请⼀块内存空间存放⼆维数组
2、⽤变量定义⼆维数组的长度
3、使⽤vector创建⼀个⼆维数组
⽅法3中,,上⾯多写了三⾏,就是为了指定数组swp的列数。今天才发现,可以⽤更简单的⽅法完成上⾯的⼯作,下⾯的⼀⾏就可以代替上⾯的四⾏
4
较早的编译器是不允许这样做的,所以⼀些书籍⽐如以Tc讲解的书本都说数组的下标不能是变量。在vc6.0下亦是如此。
不过在⼀些较新的编译器如dev c++已经⽀持了,如下代码不会报错
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a; int i;
scanf("%d",&a);
int c[a];
for( i =0 ;i<a;i++)
scanf("%d",&c[i]);
for( i =0 ;i<a;i++)
printf("%d",c[i]);
}
这个和编译器有关,应该是设计到⼀些标准规范为题吧,最好还是不要这样写~使⽤动态分配内存是⽐较把握和通⽤的
⼀维:
cin>>n;
int* a=new int[n];
if ((a) == NULL)
{}//确保没有动态分配失败
但是new出来的⼀定不要忘了delete掉
delete []a; // 正确的⽤法
delete a; // 错误的⽤法
后者相当于delete a[0],漏掉了另外n-1个对象。
⼆维:
设有m⾏n列
cin>>m>>n;
int **a = new int* [m];

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。