二级指针和二维数组的转换

 

  1. void fun(char ** p)   
  2. {   
  3.    char (*p1)[10] = (char(*)[10])p;  
  4.    cout << p1[0];
  5. }   
  6.   
  7. int main(int argc, char* argv[])
  8. {
  9.    char data[][10] = {"abc","123"};  
  10.    fun((char **)data);
  11. }

p的类型在声明形参的时候已经定义为char**了,一旦定义后它的类型是不可改变的,但可以定义另一个具有char   [][10]类型的变量,然后把p的值赋予它:   
  char   (*p1)[10]   =   (char(*)[10])p;   
  这样p1就可以使用p的值,并把p原本指向的对象类型看作char(*)[10]。   
   
  如果想把p以二维数组的形式引用,可以如下这么做:   
  p   =   (char**)malloc(5*sizeof(char*));  
  for(i=0;   i<=4;   ++i)   p[i]   =   (char*)malloc(10*sizeof(char));   
  这样p就可以用p[i][j]的形式引用了,其中i<5,j<10。这种方法适合于本来没有缓冲区而要新建一个的情况。如果本来已有缓冲区,那么可以如下这么做:   
  char   *p1=....;         //假设p1指向原来的缓冲区  
  p   =   (char**)malloc(5*sizeof(char*));  
  for(i=0;   i<=4;   ++i)   p[i]=p1+10*i;   
    

  这样p同样可以p[i][j]的方式引用。但是,以上两种方式,虽然p的外部引用方式跟一个二维数组一样,但其类型仍然是char   **,而不是char(*)[10]。

发布了107 篇原创文章 · 获赞 12 · 访问量 60万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章