数组指针和指针数组

很多人以为“指向数组的指针”就是“指向指针的指针”,于是有人写这样的代码:
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;
}


注:这里指针数组主要是想说一下,函数指针数组如何动态分配。

 

posted @ 2012-07-30 22:25  KingsLanding  阅读(418)  评论(0编辑  收藏  举报