很多人以为“指向数组的指针”就是“指向指针的指针”,于是有人写这样的代码:
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; }
注:这里指针数组主要是想说一下,函数指针数组如何动态分配。