我编写了程序来检查指针表达式的大小。我对指针感到困惑。解释编译器如何计算指针表达式的大小。
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
答案 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.您可以自己计算出其他大小。