c - sizeof(p) 和 sizeof(*p) 之间不同,而 p 具有矩阵的基本类型
问题描述
我正在学习指针,由于以下程序给出的输出,我有点困惑:
#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
产生 type 的结果size_t
,使用%zu
格式说明符打印结果。
推荐阅读
- html - 如何在 HTML 中循环显示图像
- c# - 向通过 IHttpClientFactory 创建的所有客户端添加处理程序?
- css - 在 safari 浏览器中单击时,bootstrap vue(b-tabs)显示蓝色轮廓
- angular - *ngif 模板中的 typescript null 错误
- jquery - 引导轮播仅适用于 jquery slim
- android - 无法从后端服务器获取 jwt
- python - 带有硒的机器人,我无法弄清楚这个错误
- exception - Erlang中的function_clause和badarg有什么区别?
- python - 用于遍历 mysql 表和更改表空间的 Python 脚本
- python - 如何修复“TypeError:列表索引必须是整数或切片,而不是元组”