1. 程式人生 > >C語言陣列指標指標陣列

C語言陣列指標指標陣列

在陣列指標和指標陣列這塊我總是弄不清楚,總結一下

指標陣列:用於儲存指標的陣列,也就是陣列元素都是指標

陣列指標:指向陣列的指標

關於這部分有一道題:

       一個有10個指標的陣列,該指標指向一個函式,該函式有一個整型引數並返回一個整型

      這道題一開始我總是弄不清楚          正確答案:int  (*a[10]) (int);       
C的型別系統的派生方法是巢狀,通過型別巢狀進行無限派生。如果宣告:int ( *p )( int );
       你可以很容易看明白p是一個函式指標,然後,用a[10]代替那個p,這就是個巢狀的過程,        即int  (*a[10]) (int)。
區別:

型別名稱   *陣列名稱[陣列長度];

int* a[4]     指標陣列

     

                    表示:陣列a中的元素都為int型指標    

                    元素表示:*a[i]   *(a[i])是一樣的,因為[]優先順序高於*

int (*a)[4]   陣列指標

     

                      表示:指向陣列a的指標

                      元素表示:(*a)[i]  

#include <stdio.h>
void main(void)
{
     int c[4]={1,2,3,4};
     int *a[4];          //指標陣列
     int (*b)[4];        //陣列指標
     b=&c;
     //將陣列c中元素賦給陣列a
     for(int i=0;i<4;i++)
     {
          a[i]=&c[i];
     }  
     printf("%d\n",*a[1]);       //輸出2就對   <pre name="code" class="plain">     printf("%d\n",<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">(*b)[2] </span><span style="font-size: 12px; font-family: Arial, Helvetica, sans-serif;">);  </span>
<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">}  </span>

 
  
 
   
  

注意:

定義了陣列指標,必須給指標指定一個數組的首地址

容易犯的錯得就是,不給 b 地址,直接用 (*b)[i]=c[i] 給陣列 b 中元素賦值,這時陣列指標不知道指向哪裡,除錯時可能沒錯,執行時會出現問題,使用指標時要注意這個問題。

a就不用給他地址,a的元素是指標,for迴圈內已經給陣列a中元素指定地址了。若for迴圈內寫*a[i]=c[i],也會出問題


瞭解陣列指標,與普通指標及二級指標的區別

{int a[4][5];int (*p)[5]=a;}

這裡a是個二維陣列的陣列名,相當於一個二級指標常量;

p是一個指標變數,它指向包含5int元素的一維陣列,此時p的增量以它所指向的一維陣列長度為單位;

*p+i是二維陣列a[0][i]的地址;

*(p+2)+3表示a[2][3]地址(第一行為0行,第一列為0列),**(p+2)+3)表示a[2][3]的值。

(*p)[5]其中的5在上述例子中沒有表示任何意思你可以換成除0以外的整數,[5]的作用就是幫助你記憶說你所指向的一維陣列的長度。

(不過除了與定義的二維陣列的長度一致的不會警告之外 )其他的數會警告但是不影響結果。

//(*p)[5]其中的5換成其他的數字在vc++6.0環境中都無法通過編譯

陣列指標:

int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int (*p)[4];

p=a;

for(int i=0;i<3;i++)
{

       for(int j=0;j<4;j++)
  {
             printf("%d",p[i][j]);                //或者 **p+i+j) 或者 *p[i]+j
  }
  printf("\n");
}

指標陣列:

int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int *p[3];
for(int ix=0;ix<3;ix++)

{
  p[ix]=a[ix];

}

for(int i=0;i<3;i++)
{

       for(int j=0;j<4;j++)
  {
           printf("%d",p[i][j]);              //或者    **p+i+j)   或者   *p[i]+j
  }
  printf("\n");
}