二級指針和二維數組的轉換

 

  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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章