数组指针、数组首地址与内存的关系

来源:互联网 发布:java项目反编译 编辑:程序博客网 时间:2024/06/12 01:46
在下面的定义了一个结构体typedef unshort MB16typedef MB16 MDID;typedef MDID MDIDI[2];void test(MDIDI* mdid){ printf("%d,%d/n",mdid[0],mdid[1]);}void main(){ MDIDI m_mdidi; m_mdidi[0] = 1; m_mdidi[1] =2; test(m_mdidi);}当编译时,发现出错,报说类型不一致,查看一下,才知道MDIDI* mdid,这个保存的是MDIDI的地址,而MDIDI本身是数组的地址,所以MDIDI* mdid应该是指针的指针,它用保存了MDIDI地址的值。知道原因后,把test(m_mdidi);改成test(&m_mdidi);但是运行时结果却是1,0。有点不理解,然后跟踪了一个代码,找了一个内存,发现mdid[1]的地址变成0x00480744,而mdid[0]的地址是0x0048073c,说明加1时加了4个字节,那就是MDIDI*的一个存储内容所占用的字节。所以j最终的代码应该是void test(MB16 * mdid){ printf("%d,%d/n",mdid[0],mdid[1]);}void main(){ MDIDI m_mdidi; m_mdidi[0] = 1; m_mdidi[1] =2; test(m_mdidi);}这样,结果就正确了。从这个例子中,可以看到,基础还是比较差的了,有些东西学到了,但是没有理解,真正是知其然不知其所以然。其时这个例子用int来写可能就知道是这样写了。但是用上面的定义时,就发现了这些问题,说明没有理解教科书中里的真正函义了。