CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

有关sizeof(),请帮忙解答一下

楼主zl0126()2005-09-25 22:04:54 在 C/C++ / C语言 提问

#include<stdio.h>  
  main   ()  
  {  
  int   zippo[4][2]={{2,4},{6,8},{1,3},{5,7}};  
  printf("%d\n",sizeof(zippo+1));  
  printf("%d\n",sizeof(*zippo+1));  
  printf("%d\n",sizeof(*(zippo+1)));  
  }  
  vc6.0下运行结果:4  
                                    4  
                                    8  
  问题是sizeof(*(zippo+1))为什么是8而不是4?  
  问题点数:20、回复次数:24Top

1 楼fiftymetre(50米深蓝)回复于 2005-09-25 22:12:30 得分 5

zippo+1  
   
  zippo是个int[4][2]的指针,   所以zippo+1也是一指针  
  指针在32位机和vc6下大小为4  
   
  *zippo+1  
   
  *zippo是个int[2]的指针,所以*zippo+1也是一指针  
  同理,大小为4  
   
  *(zippo+1)表示zippo[1],也就是一个int[2]类型  
  大小为2*sizeof(int)   =   8Top

2 楼foochow(无聊,灌水......)回复于 2005-09-25 22:16:36 得分 0

支持水母Top

3 楼megaboy(飞天御剑流之杀神一刀斩)回复于 2005-09-25 22:19:33 得分 0

*(zippo+1)是zippo[1]的等价表达式,zippo[1]代表了一个具有2个int元素的数组,具有数组类型,因此sizeof(*(zippo+1))的结果是zippo[1]数组的长度:2xsizeof(int)=2x4=8。Top

4 楼sankt(宠辱不惊,看庭前花开花落;去留无意,望天空云卷云舒.)回复于 2005-09-25 22:20:37 得分 0

up  
  Top

5 楼fiftymetre(50米深蓝)回复于 2005-09-25 22:22:02 得分 0

水母是谁Top

6 楼pbcd(沙漠绿州)回复于 2005-09-25 22:43:14 得分 0

*(zippo+1)不是指针!?Top

7 楼greenteanet(扎扎实实打基础,保持一颗平常心。)回复于 2005-09-26 00:49:35 得分 0

zippo+1  
   
  zippo是个int[4][2]的指针,   所以zippo+1也是一指针  
  指针在32位机和vc6下大小为4  
   
  *zippo+1  
   
  *zippo是个int[2]的指针,所以*zippo+1也是一指针  
  同理,大小为4  
   
  *(zippo+1)表示zippo[1],也就是一个int[2]类型  
  大小为2*sizeof(int)   =   8  
  -------------------------  
  说得合理。Top

8 楼cdo(Everything has a favourable turn)回复于 2005-09-26 00:58:17 得分 0

*(zippo+1)不是指针!?  
  ----------------  
   
  *(zippo+1)不是指针!?是内容啦,zippo+1才是指针  
  Top

9 楼mefit(何足道)回复于 2005-09-26 08:33:26 得分 0

唉  
  怎么都是***啊  
   
  Top

10 楼understand999()回复于 2005-09-26 11:06:05 得分 0

eprint自定义打印是一个页面套打工具.它直接在IE浏览器中可视化的设计各种复杂的打印模版,  
  能够解决在IE浏览器中打印各种复杂的中国式报表及票据。详见:   http://218.30.103.110:8080/eprint/index.htm  
   
   
  方成eform是web表单,纯BS结构.100%开放源码.可以在   http://218.30.103.110:8080/eform/index.html   在线试用.  
   
  联系电话:010-82645151  
    详情参见:http://www.fcsoft.com.cn  
   
          webprint是一个基于表格的页面打印解决方案.先将要打印的数据及样式组织到一个HTML的TABLE元素中,   然后将这个TABLE元素传给webprint,实现分页打印预览,出打印对话框打印和直接打印。Top

11 楼xtaddqqug(王中)回复于 2005-09-26 18:16:09 得分 5

首先zippo是一个二维数组的首地址,即一个指针,在VC6中,指针都是32位的,即4个字节。  
  zippo+1同样是一个指针,所以sizeof(zippo+1)=4;  
  zippo==zippo[0]==zippo[0][0];zippo+1==zippo[1]==zippo[1][0],加1其实是加8,即向后指了8个字节(两个整数)  
  一个二维数组,也就是一个指向指针的指针,int   zippo[4][2]<=>int   **p;(等价于)  
  所以*zippo的内容也是一个指针,*zippo+1也是一个指针,所以它的大小也是4个字节。  
  什么是二维数组呢,其实二维数组的每个元素也是数组,真对int   zippo[4][2],zippo是一个有4个元素的数组,它的每个元素zippo[X]是一个有两个整数元素的一维数组,占8个字节。  
  如我以上所说*(zippo+X)=zippo[x],即*(zippo+X)<=>zippo[x]  
  所以sizeof(*(zippo+X))==sizeof(zippo[x])==8.  
   
  Top

12 楼megaboy(飞天御剑流之杀神一刀斩)回复于 2005-09-26 18:30:10 得分 0

"首先zippo是一个二维数组的首地址,即一个指针"  
   
  呵呵,这句话搞笑。Top

13 楼antijpn(antijpn)回复于 2005-09-26 18:40:34 得分 0

int[2]在VC下面当然是8了……Top

14 楼titan52(* *的徒弟 )回复于 2005-09-27 14:35:37 得分 0

***____***  
  大家看到它不是头疼,就是头晕Top

15 楼NeuSoftRen()回复于 2005-09-28 11:50:32 得分 5

指针是指针,是一种变量,它的值为内存的地址值;  
  二维数组中不存在指针,有的只是地址,例如*(zippo+1)的值为地址,该地址是代表着存储了两个int数据的内存空间即int[2];Top

16 楼BluntBlade(信仰迷离·重构之道,在于Redo/Undo之间)回复于 2005-09-28 12:34:33 得分 5

zippo只是一个地址值,它的类型是int   [4][2]  
  等价的“退化”类型是int   (*)[2]  
  因此zippo+1“跳”到了下一个int   [2]的位置,再使用解引用运算符*,即得到一个int   [2]对象。  
  对此对象求sizeof……Top

17 楼lxb365(to be loved)回复于 2005-09-28 12:35:57 得分 0

不对啊,各位,如果printf("%d\n",sizeof(zippo));是32啊,怎么能说zippo是指针呢?Top

18 楼steedhorse(晨星)回复于 2005-09-28 12:41:09 得分 0

楼上,也不能说别人说得不对。因为“指针”这个词含义本来就是不确定的。  
  我们说“指针”,有时候指的的是指针变量,有时候不是。Top

19 楼megaboy(飞天御剑流之杀神一刀斩)回复于 2005-09-28 12:45:06 得分 0

k&R   出版的《The   C   programming   language》明确指出数组名跟指针是不同的,它不是指针。Top

20 楼sjf331(兄弟)回复于 2005-09-28 15:22:51 得分 0

数组名是数组地址类型常数,而指针是存放地址的变量.  
  int   t[3];  
  sizeof(t)   is   12;  
   
  int   *t;  
  sizeof(t)   is   4;  
   
  <<c和指针>>   中写的很清楚.  
  指针不是类型,地址才是类型.Top

21 楼Chrisma(Chrisma)回复于 2005-09-28 15:47:55 得分 0

到maguangzhi.bokee.com下载讲义吧,很清楚的:  
        sizeof()不能看作运算符函数,理由sizeof(printf("abcdef")  
  不会打印abcdef的Top

22 楼ilovedudu(void *)回复于 2005-10-01 07:17:42 得分 0

整理中.....Top

23 楼yayafu(维生素C)回复于 2005-10-01 09:08:11 得分 0

zippo不是指针Top

24 楼AntonlioX(做人要厚道)回复于 2005-10-01 10:54:02 得分 0

mark  
  Top

相关问题

  • 有关邮件的问题,谁能帮我解答一下
  • 有关JAVA的小问题,不知哪位高手帮我解答一下
  • 有关树节点的问题,请朋友们帮忙解答一下.
  • 谁能解答一下?
  • 帮忙给解答一下
  • 哪位给个有关ASCII的解答
  • 偶是菜菜鸟,有一道有关输出字符串的麻烦问题请帮我解答一下,大家不要笑啊!
  • EJB是什么?谁能解答一下?
  • 帮我解答一下这个问题。
  • 有谁帮我解答一下?

关键词

  • 指针
  • 打印
  • vc
  • zippo
  • 数组
  • 二维
  • 地址
  • 元素
  • sizeof
  • 类型

得分解答快速导航

  • 帖主:zl0126
  • fiftymetre
  • xtaddqqug
  • NeuSoftRen
  • BluntBlade

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo