sizeof指向数组的指针

时间:2014-08-10 07:31:32

标签: c pointers sizeof

我编写了程序来检查指针表达式的大小。我对指针感到困惑。解释编译器如何计算指针表达式的大小。

void main() {
    int (*p)[20][30];
    int (*q)[4];
    int a[2][4];
    int **r=a;
    printf("%d %d %d\n",  sizeof(**r),sizeof(*r),sizeof(r));
    printf("%d %d %d\n",  sizeof(a),sizeof(a[0]),sizeof(a[0][1]));
    printf("%d %d %d\n",  sizeof(q),sizeof(*q),sizeof(**q));
    printf("%d %d %d\n",  sizeof(p),sizeof(*p),sizeof(**p));
}

输出

4  4  4  
32 16 4
4  16 4
4 2400 120 

3 个答案:

答案 0 :(得分:1)

int a[2][4];
int **r=a;           

它意味着r是一个指针,它存储指向数组的另一个指针的地址" a"。

  • **r只包含整数变量,因此sizeof(**r)会 是4bytes。

  • *r是一个整数指针,因此sizeof(*r)将为4字节。

  • r也是一个指向另一个整数指针的整数指针 所以sizeof(r)将是4字节。

  • a[2][4]是一个2D数组,可存储8个整数值,因此sizeof(a) 将是(8 * 4)= 32字节。

  • a[0]是子数组,可以存储4个整数值 sizeof(a[0])将为(4 * 4)= 16bytes。

  • a[0][1]只是一个整数值,所以sizeof(a[0][1]) = 4bytes。

int (*q)[4];

这个声明意味着q是一个指向4个整数数组的指针,它的基类型是一个4-int数组。

  • q是一个整数指针,因此sizeof(q)将为4字节。

  • * q只是4个子数组,每个子数组包含4个整数值,因此sizeof(*q)将为16个字节。

  • ** q表示整数值,因此sizeof(**q)将为4字节。

int (*p)[20][30];

  • p是一个整数指针,因此sizeof(p)将是4字节。

  • * p是一个2D整数数组,由20行和30列组成,因此sizeof(*p)将为(20 * 30 * 4)= 2400bytes。

  • ** p表示子列由30列组成,因此sizeof(**p)将为(30 * 4)= 120字节。

答案 1 :(得分:0)

解释

for a => total 8 elements => 8*4 =32
for a[0]=> first sub array containing 4 elements => 4*4 =16
for a[0][1] => single element => 4 
for q => 4 
for *q => 4*4 =16
for **q => single element => 4
for p => 4
for *p => 20*30 =600 elements => 600 *4 =2400
for **p => first sub array => 30 elements => 30*4 =120
All **r,*r,r are integer pointers so occupy 4 bytes.
Here each integer occupies 4 bytes

答案 2 :(得分:0)

我看到你的系统架构是32位。

int a[2][4];
int **r=a;

不是有效代码。 a会衰减到int (*a)[4],这与int **r的类型不同。您没有提供有关编译器警告的信息。这里的矿井与提到的代码相关:

  

警告:从不兼容的指针类型初始化[启用   默认]

所以,修复后(将r更改为int (*r)[4];我的输出为:

4 16 8
32 16 4
8 16 4
8 2400 120

你应该知道指针存储了一个特定的内存地址。所以它的大小可能因系统架构而异。你可以看到我的机器的架构是64位。地址长度为8个字节(1个字节= 8位,8个字节= 64位),因此指针类型的大小等于8.您可以自己计算出其他大小。