sizeof(p) 和 sizeof(*p) 不同,而 p 具有矩阵的基本类型
different between sizeof(p) and sizeof(*p) while p has base type of a matrice
我正在学习指针,由于以下程序给出的输出,我有点困惑:
#include <stdio.h>
#define R 10
#define C 20
int main()
{
int arr[R][C];
int (*p)[R][C]=&arr;
printf("%d ", sizeof(p));
printf("%d ", sizeof(*p));
return 0;
}
输出:4
800
为什么输出是800
?我们知道 p
是一个指针,其基本类型为 10
行和 20
列的二维数组,这意味着 *p
指向 0th array
,这意味着 sizeof(*p)=20*sizeof(int)=80
和 sizeof(p)
应该等同于 800
但输出与我的计算有很大不同!
我能得到一个解释吗?非常感谢。
TL;DR - 始终遵循数据类型!
p
是指针类型的变量,所以sizeof(p)
是你平台上指针的大小,刚好是4
.
sizeof(*p)
和sizeof(int[R][C])
是一样的,就是一个int
的大小乘以R
和C
.结果是 sizeof(int) == 4
(在您的平台上),10
和 20
,相乘,800
。
注意:在 sizeof
运算符的情况下,数组不会 衰减 指向第一个元素的指针,它保留类型。
就是说,sizeof
产生类型 size_t
的结果,使用 %zu
格式说明符打印结果。
我正在学习指针,由于以下程序给出的输出,我有点困惑:
#include <stdio.h>
#define R 10
#define C 20
int main()
{
int arr[R][C];
int (*p)[R][C]=&arr;
printf("%d ", sizeof(p));
printf("%d ", sizeof(*p));
return 0;
}
输出:4
800
为什么输出是800
?我们知道 p
是一个指针,其基本类型为 10
行和 20
列的二维数组,这意味着 *p
指向 0th array
,这意味着 sizeof(*p)=20*sizeof(int)=80
和 sizeof(p)
应该等同于 800
但输出与我的计算有很大不同!
我能得到一个解释吗?非常感谢。
TL;DR - 始终遵循数据类型!
p
是指针类型的变量,所以sizeof(p)
是你平台上指针的大小,刚好是4
.sizeof(*p)
和sizeof(int[R][C])
是一样的,就是一个int
的大小乘以R
和C
.结果是sizeof(int) == 4
(在您的平台上),10
和20
,相乘,800
。
注意:在 sizeof
运算符的情况下,数组不会 衰减 指向第一个元素的指针,它保留类型。
就是说,sizeof
产生类型 size_t
的结果,使用 %zu
格式说明符打印结果。