鱼C论坛

 找回密码
 立即注册
查看: 3402|回复: 10

[已解决]printf("%d",(int)(&p[3][2] - &array[3][2]));

[复制链接]
发表于 2022-10-25 12:03:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>

int main()
{

  int array[5][5] = {0}; //将array二维数组初始化为0;
  int (*p)[3] = (int(*)[3])&array; //强制转换为一个长度为3的数组指针;
  printf("%d",(int)(&p[3][2] - &array[3][2]));  

  return 0;
}


用VS编译出来的结果是-6,想问一下这里的&p[3][2]所取的地址是多少呢?怎么取的呢?
最佳答案
2022-10-25 12:19:19
本帖最后由 jackz007 于 2022-10-25 13:20 编辑

      & p[3][2] 、& array[3][2] 都是二维数组元素的内存地址。
      &  p[3][2] - & array[3][2] 两个元素内存地址之差,单位是元素,如果这个差值是 x,那么,就是说,这两个元素的位置(索引)相差了 x 个元素。

      p 和 array 都是二维数组,不同之处是,p 的末维是 3,而 array 是 5,p 指向了 arry 的开头,那么,p[3][2] 和 array[3][2] 存在什么区别呢?
我们知道,二维数组在内存中实际上是按照一维数组的顺序存放数据的,如果把二者视为一维数组,那么,p[3][2] 其实就是 p[3 * 3 + 2] = p[11],而 array[3][2] = array[5 * 3 + 2] = array[17],就是说,二者的索引相差了 11 - 17 = -6。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-25 12:19:19 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2022-10-25 13:20 编辑

      & p[3][2] 、& array[3][2] 都是二维数组元素的内存地址。
      &  p[3][2] - & array[3][2] 两个元素内存地址之差,单位是元素,如果这个差值是 x,那么,就是说,这两个元素的位置(索引)相差了 x 个元素。

      p 和 array 都是二维数组,不同之处是,p 的末维是 3,而 array 是 5,p 指向了 arry 的开头,那么,p[3][2] 和 array[3][2] 存在什么区别呢?
我们知道,二维数组在内存中实际上是按照一维数组的顺序存放数据的,如果把二者视为一维数组,那么,p[3][2] 其实就是 p[3 * 3 + 2] = p[11],而 array[3][2] = array[5 * 3 + 2] = array[17],就是说,二者的索引相差了 11 - 17 = -6。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-25 14:09:26 | 显示全部楼层
jackz007 发表于 2022-10-25 12:19
& p[3][2] 、& array[3][2] 都是二维数组元素的内存地址。
      &  p[3][2] - & array[3][2] 两个 ...

[img][/img]您好我可以这样理解吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-25 14:11:35 | 显示全部楼层
是fafa也是花花 发表于 2022-10-25 14:09
[/img]您好我可以这样理解吗


                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-25 14:20:13 | 显示全部楼层

          看不到你贴出的图片。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-25 14:35:13 | 显示全部楼层
jackz007 发表于 2022-10-25 14:20
看不到你贴出的图片。

                0      
                1      p[0]
array[0]     2
                3
                4
中间省略
                10     p[3]
                11               p[3][2]      相差
array[2]     12                                  1
                13                                   2
                14                                   3
-----------------         
                15                                   4
                16                                   5
array[3]     17               array[3][2]     6       结果为-6
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-25 14:51:01 | 显示全部楼层
本帖最后由 jackz007 于 2022-10-25 14:54 编辑
是fafa也是花花 发表于 2022-10-25 14:35
0      
                1      p[0]
array[0]     2

     arrar[0][0] -  0 - p[0][0]
                    1  
                    2  
                    3 - p[1][0]
                    4
     array[1][0] -  5
                    6 - p[2][0]
                    7
                    8
                    9 - p[3][0]
     array[2][0] - 10
                   11 - p[3][2]
                   12 - p[4][0]
                   13
                   14
     array[3][0] - 15 - p[5][0]
                   16  
     array[3][2] - 17 
                   18 - p[6][0]
                   19 
     array[4][0] - 20
                   21 - p[7][0]
                   22
                   23                     
                   24 - p[8][0]
        p[3][2] 的一维索引是 11,array[3][2] 的一维索引是 17,二者相差值为 -6
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-25 14:57:13 | 显示全部楼层
jackz007 发表于 2022-10-25 14:51
p[3][2] 的一维索引是 11,array[3][2] 的一维索引是 17,二者相差值为 -6

对的,我想说的是,我这样理解是正确的吗?另外,再次感谢您大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-25 15:00:51 | 显示全部楼层
是fafa也是花花 发表于 2022-10-25 14:57
对的,我想说的是,我这样理解是正确的吗?另外,再次感谢您大佬

         不好意思,没能看懂你的图。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-25 15:09:00 | 显示全部楼层
jackz007 发表于 2022-10-25 15:00
不好意思,没能看懂你的图。

把二维数组看成线性的形式储存,用这个图来理解array[3][2]和p[3][2]的地址之差
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-25 15:10:38 | 显示全部楼层
是fafa也是花花 发表于 2022-10-25 15:09
把二维数组看成线性的形式储存,用这个图来理解array[3][2]和p[3][2]的地址之差

        7 楼的图解就是这个意思。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-25 09:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表