2014-01-25 46 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?