2014-01-25 50 views
3

指針的函數我寫了一個程序來測試指針的動作,但我沒有得到後面輸出的邏輯。在混亂關於C語言

好像我用arr+1然後,而不是第二個位置,我得到第7和類似與*arr+1的情況下,我覺得怪異*表達出的地址並不值。

誰能explain輸出,拜託了!

方案是:

#include<stdio.h> 
int main() 
{ 
    static int arr[2][3][2] = {1,2,3,4,5,6,7,8,9,10,11,12}; 
     int i,j,k; 
     printf("%d\t",arr); 
     printf("%d\t",*arr); 
     printf("%d\n",**arr); 
     printf("%d\n",***arr); 
     printf("%d\t",arr+1); 
     printf("%d\t",*arr+1); 
     printf("%d\n",**arr+1); 
     printf("%d\n",***arr+1); 
     for(i=0;i<2;i++) 
     { 
      for(j=0;j<3;j++) 
      { 
      for(k=0;k<2;k++) 
       printf("%d  %u \n",*(*(*(arr+i)+j)+k),&arr[i][j][k]); 
       printf("\n"); 
      } 
     printf("\n"); 
     } 
return 0; 
} 

和輸出是:

4202512 4202512 4202512 
1 
4202536 4202520 4202516 
2 
1  4202512 
2  4202516 

3  4202520 
4  4202524 

5  4202528 
6  4202532 

7  4202536 
8  4202540 

9  4202544 
10  4202548 

11  4202552 
12  4202556 

回答

2

聲明一個int [2][3][2]陣列,這意味着:

  • 表達arr的類型是int [2][3][2]數組,所以你只能得到該類型的指針。
  • 表達式的類型arr[0]*arr是一個int [3][2]數組,因此您只能從該類型獲取指針。
  • 表達式的類型arr[0][0]**arr是一個int [2]數組,因此您只能得到該類型的指針。
  • 表達式的類型arr[0][0][0]***arrint,因此您只能從該類型獲得int值。這個過程的

變化會給類似的結果。

你總是得到相同的基地址,因爲多維數組是平的內存和尺寸大小用於分割該平面內存。

int [2][2]是這樣的:

0, 1 
2, 3 

其中數字類似於在存儲器元素的順序,以及二維顯示類似陣列的行/列的訪問。

1

你的第一個3個打印件顯示你相同的地址,但有不同的含義(和類型) -

  1. arr是你的整個3D數組的地址,int***類型的(你投指針到整數,不是一個好的做法,因爲在某些系統也可能是更大的)
  2. *arr是的地址「扁平」 int**類型的2D陣列,有效地位於arr[0]
  3. **arr是兩倍的地址「扁平」 1D陣列的類型int*,有效地位於arr[0][0]
  4. 只有***arr終於爲您帶來的arr[0][0][0]

實際int值現在你開始指針算術,這是由指針的類型確定爲居留權提到和大小每個維度(編譯器已知)。所以:

  1. arr+1給你的arr[1]的地址,這是從arr[0]由2個* 3 INT元件(6 * 4 = 24這裏)
  2. *arr+1給你的地址arr[0][1],這是的長度除去由2個INT元件(2 * 4 = 8在這裏)
  3. **arr+1給你的arr[0][0][1]地址,這是從arr[0][0][0]由一個INT元件(4這裏)
  4. 的長度除去的長度從arr[0][0]除去給你arr[0][0][1],這簡直是2

另見這個答案 - How are 3D arrays stored in C?