超级诡异的c语言指针计算

int x = (int(*)[7])256- (int(*)[7])0;
运行后x结果为9,不知道该如何解释?
#include <stdio.h>

typedef int (*p)[7] ; // 这里的和你的那里其实效果一样,只是你给出的是一个空名字类型的。
typedef p PA;

int main()
{
     int x = (PA)256 - (PA)0;

     printf("x = %d/n", x);
     return 0;
}

首先呢,你没有明白你的程序为什么会输出9,
说真的,这个只是你没有真正的理解指针,我们先来解析一下
(*)[7] :表示一个指向有 7 个元素数组的指针,
int .... : 表示这些元素的类型是int 型的。
那么:
(int (*)[7]):表示一个指向拥有7个int型元素数组的指针 。
那么(PA)256的类型与(PA)0类型的相减就成了 指针与指针的相减了,
指针与指针的相减与类型相关的哦。我们这里的类型是
(int (*)[7]) 类型,只是我用 PA来表示,更加容易理解嘛!呵呵!
你看一下,那PA是多大呢?? 28 吗? 呵呵!不对,是4
PA是一个指针,指向的是一个数组。
只是PA的类型却是另一类,呵呵,是不是有点晕了!!
所以说,
(PA)256 也就是强制的将256转换成了一个指向 [7] 的指针了,
那么 [7]的大小是多少呢? 28 !!!呵呵,这次说对了,类型是int  
的嘛!!!
那么
256/28 - 256/0 =====???多少? 9
呵呵就是这 样子来的!
你可以试一下,你把[7]改成8,试试,你现在就猜一下嘛?我想应该是8.
也说不一定哦,试试!!!
说实话 ,本人没有看懂 :(
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值