指针与指针数组

来源:互联网 发布:centos 网络监控 编辑:程序博客网 时间:2024/04/30 15:38
很多人以为“指向数组的指针”就是“指向指针的指针”,于是有人写这样的代码:
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
0 0
原创粉丝点击