C++申请二维数组
2015-09-17 16:52 Erdos001 阅读(382) 评论(0) 编辑 收藏 举报知识预备:
这两个名字不同当然所代表的意思也就不同。我刚开始看到这就吓到了,主要是中文太博大精深了,整这样的简称太专业了,把人都绕晕了。从英文解释或中文全称看就比较容易理解。
指针数组:array of pointers,即用于存储指针的数组,也就是数组元素都是指针
数组指针:a pointer to an array,即指向数组的指针
还要注意的是他们用法的区别,下面举例说明。
int* a[4] 指针数组
表示:数组a中的元素都为int型指针
元素表示:*a[i] *(a[i])是一样的,因为[]优先级高于*
int (*a)[4] 数组指针
表示:指向数组a的指针
元素表示:(*a)[i]
注意:在实际应用中,对于指针数组,我们经常这样使用:
1
2
|
typedef int * pInt; pInt a[4]; |
这跟上面指针数组定义所表达的意思是一样的,只不过采取了类型变换。
代码演示如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
#include <iostream> using namespace std; int main() { int c[4]={1,2,3,4}; int *a[4]; //指针数组 int (*b)[4]; //数组指针 b=&c; //将数组c中元素赋给数组a for ( int i=0;i<4;i++) { a[i]=&c[i]; } //输出看下结果 cout<<*a[1]<<endl; //输出2就对 cout<<(*b)[2]<<endl; //输出3就对 return 0; } |
注意:定义了数组指针,该指针指向这个数组的首地址,必须给指针指定一个地址,容易犯的错得就是,不给b地址,直接用(*b)[i]=c[i]给数组b中元素赋值,这时数组指针不知道指向哪里,调试时可能没错,但运行时肯定出现问题,使用指针时要注意这个问题。但为什么a就不用给他地址呢,a的元素是指针,实际上for循环内已经给数组a中元素指定地址了。但若在for循环内写*a[i]=c[i],这同样会出问题。总之一句话,定义了指针一定要知道指针指向哪里,不然要悲剧。
类似的还有指针函数和函数指针,遇到了再说吧。
转自:
C++编程语言中有一种叫做new的二维数组,它的应用方式比较灵活,可以有多种方法来帮助我们实现一些特定功能。在这里我们将会总结几种C++二维数组new的应用方式,来进行逐一的点评。
C++二维数组new应用方式一:
- A (*ga)[n] = new A[m][n];
- ...
- delete []ga;
缺点:n必须是已知
优点:调用直观,连续储存,程序简洁(经过测试,析构函数能正确调用)
C++二维数组new应用方式二:
- A** ga = new A*[m];
- for(int i = 0; i < m; i++)
- ga[i] = new A[n];
- ...
- for(int i = 0; i < m; i++)
- delete []ga[i];
- delete []ga;
缺点:非连续储存,程序烦琐,ga为A**类型
优点:调用直观,n可以不是已知
C++二维数组new应用方式三:
- A* ga = new A[m*n];
- ...
- delete []ga;
缺点:调用不够直观
优点:连续储存,n可以不是已知
C++二维数组new应用方式四:
- vector > ga;
- ga.resize(m); //这三行可用可不用
- for(int i = 1; i < n; i++) //
- ga[i].resize(n); //
- ...
缺点:非连续储存,调试不够方便,编译速度下降,程序膨胀(实际速度差别不大)
优点:调用直观,自动析构与释放内存,可以调用stl相关函数,动态增长
C++二维数组new应用方式五:
- vector ga;
- ga.resize(m*n);
方法3,4的结合
C++二维数组new应用方式六:
2的改进版
- A** ga = new A*[m];
- ga[0] = new A[m*n];
- for(int i = 1; i < m; i++)
- ga[i] = ga[i-1]+n;