若定义short a[4]={11, 22, 33, 44}; ,则表达式 (int)&a[3] – (int)&a[0]的值是
44-11结果应当是33呀,为何答案为6?
3 * 2啊
这里比较的是第3个元素和第0个元素所在的地址偏移量,不是你想的元素值之差!注意&符号,是取地址
因为两个元素之间差3个元素,且每个元素是short类型,占2个字节,因此两者想减的结果是6,也就是偏移量是6个字节
该回答引用GPTᴼᴾᴱᴺᴬᴵ
在这个表达式中,对数组元素取地址得到的是指向元素的指针。因此,(int)&a[0]是指向数组第一个元素的指针,即指向11的指针。同样,(int)&a[3]是指向数组第四个元素的指针,即指向44的指针。
-
由于a是一个short类型的数组,因此a的每个元素占用2个字节。因此,(int)&a[3] - (int)&a[0]计算的是两个指针之间的距离,也就是两个指针所指向的内存地址之间的距离,以字节为单位。
-
在这个例子中,(int)&a[3]的值是地址为0x1006的指针,(int)&a[0]的值是地址为0x1000的指针。因此,(int)&a[3] - (int)&a[0]的结果是0x1006 - 0x1000,即6。
-
需要注意的是,这个表达式的结果并不是数组中最后一个元素的值与第一个元素的值的差,而是它们在内存中的地址之差。如果想要得到最后一个元素与第一个元素的差,应该使用a[3] - a[0],结果为33。
该回答引用ChatGPT
这是因为在计算 (int)&a[3] - (int)&a[0] 时,将数组下标转换成地址时使用的是 sizeof(short),而不是 sizeof(int)。因此实际上计算的是 3 个 short 类型元素占用的内存字节数,即 6 个字节。所以结果是 6。