很多人以为“指向数组的指针”就是“指向指针的指针”,于是有人写这样的代码:
int a[3][4];
int **p = a;//错误
这个代码的错误之处在于a是一个数组,它的成员也是数组,所以a叫做“数组的数组”——C++中严格说来没有二维数组。那么,你要用一个指针来记录a,就要用一个能表示“数组的数组”的指针,以下代码是正确的:
int (*p)[4] = a;//正确
只有这样才能保证++p使p指向a的下一对像(该对像是一个数组)。
顺便提一句:不要写成“int *p[4];”
int a[3][4];
int **p = a;//错误
这个代码的错误之处在于a是一个数组,它的成员也是数组,所以a叫做“数组的数组”——C++中严格说来没有二维数组。那么,你要用一个指针来记录a,就要用一个能表示“数组的数组”的指针,以下代码是正确的:
int (*p)[4] = a;//正确
只有这样才能保证++p使p指向a的下一对像(该对像是一个数组)。
顺便提一句:不要写成“int *p[4];”
来看一下指针数组的指针怎么用,既然都是指针也应该支持动态内存分配,下面的例子展示了如何对数组的指针动态分配内存:
#include <stdio.h>
int main()
{
int array[3][5]={{1,2,2,4,4},{2,6,5,3,2},{3,5,7,3,5}};
int (*pa)[5]=array;
int *pb[3];
int i=0;
int (*pp)[5];
pp = (int (*)[5]) malloc(sizeof(int) * 3);//注:需要这样对指向数组的指针分配空间
pp = array;
*pb=*pa;
*(pb+1)=*(array+1);
pb[2]=pa[2];
for(;i<3;++i){
int j=0;
for(;j<5;++j)
printf("%d",pb[i][j]);
printf(" ");
}
printf("\npp pointer point to an array: \n");
for(i = 0; i < 5; i++)
printf("%d ",(*pp)[i]);
printf("\n");
return 0;
}
运行结果:
C++ 使用new 可以这样写:
#include <iostream>
using namespace std;
int main()
{
int (*p)[3];
int pp[2][3] = {1,2,3,4,5,6};
// p = new int ((*)[])[3];
p = (int (*)[3])new int [3];
p = pp;
for(int i =0; i < 3; i++)
cout<<(*p)[i]<<" ";
cout<<endl;
p = pp + 1;
for(int i =0; i < 3; i++)
cout<<(*p)[i]<<" ";
cout<<endl;
return 0;
}
运行结果:
下面使用一个函数指针数组来展示一下指针数组的用法:
#include <iostream>
using namespace std;
typedef void (*F)();
void func_1()
{
cout<< "func_1"<<endl;
}
void func_2()
{
cout << "func_2"<<endl;
}
int main()
{
F *p = (F *) new int [4];
p[0] = func_1;
p[1] = func_2;
p[0]();
p[1]();
return 0;
}
注:这里指针数组主要是想说一下,函数指针数组如何动态分配。
make it simple, make it happen