Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1002411
  • 博文数量: 153
  • 博客积分: 4195
  • 博客等级: 上校
  • 技术积分: 2631
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-22 11:32
文章存档

2012年(7)

2010年(35)

2009年(111)

分类:

2009-06-22 13:03:59

最近在看林锐博士的高质量c/c++编程指南,在书的后面附了一张测试的卷子,做了一下,发现自己很多都是处于半懂半不懂得阶段,比如下面这道关于sizeof的题目:

 

 

1void Func ( char str[100])

{

请计算

  sizeof( str ) =   4      2 分)

}

 

2char    str[100 ] = {0} ;

char   *p = str ;

int     n = 10;

请计算

sizeof (str ) =  100    2 分)          

sizeof ( p ) =   4    2 分)            

sizeof ( n ) =   4    2 分)

 

 

3void *p = malloc( 100 );

请计算

sizeof ( p ) =  4       2 分)

 

其实大部分还是很好理解的,但是对于1、和2中的第一小问我刚开始被纳闷到了,同样都是对数组的首地址取sizeof,怎么会两者截然不同,开始我还怀疑林锐博士的书出错了,自己编了个小程序果然如此,在网上查了一下资料,得到结果如下:

 

Char   str[100];  
sizeof
是个编译器常量,当程序执行到这里的时候,编译器在编译阶段己经知道他的长度了,会把它的长度记录, sizeofC中的一个操作符,是语言层面的功能,这个计算结果是在编译时完成的,就是说编译器看到这个语句,它就会用100这个常数去替换,因此 生成的的汇编代码里有它的长度!  

 

当数组名作为参数传递时,会退化为指同类型的指针!  也就是说此事在1、中的str已经只是一个地址了,所以当然是4了,这也是为什么我们传递数组的时候除了给他首地址还要给它数组的大小的缘故。

 

阅读(1193) | 评论(3) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2009-07-02 13:35:09

char是只占用一个字节,但是它的地址是32位的。int占用4个字节,但它的地址也是32位的,而且是横跨了4个地址的,这也是为什么int型地址要是4的倍数的

chinaunix网友2009-07-02 13:31:36

我认为说法是一样的。 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址.在32位程序里,所有类型的指针的值都是一个32位整数,因为32位程序里内存地址全都是32位长。

土土狗2009-07-02 11:19:11

"也就是说此事在1、中的str已经只是一个地址了,所以当然是4了..." 我觉得这里不妥,如果str是地址,那么char型只占用1字节,怎么是4? 数组名做为进参时 是指针形式,而这里应该是32位系统所以指针占了4字节,如果是51的话只有2字节。不知道我这样想对部队。