有关sizeof(),请帮忙解答一下
#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




