sizeof问题

Wijor 2009-08-01 07:19:53
int *p=null;
sizeof(p)的值是多少?
sizeof(*p)呢?

int a[100];
sizeof(a)的值是多少?
sizeof(a[100])呢?
sizeof(&a)呢?
sizeof(&a[0])呢?

int b[100];
void fun(int b[100])
{
sizeof(b);//sizeof(b)的值是多少?
}


会的朋友指教下,先说声谢了....重点是说原因....
...全文
187 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
mu_yang 2009-08-01
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 mlzhu007 的回复:]
sizeof(&a)在gcc环境下,是4
在vc环境下是400
a表示数组a的首地址值,是个常量,对这个常量取地址(&a)表示什么标准C没有规定,由各编译器自行决定,所以,这种运算是不可移植的。另外,对数组名取地址也没有实际意思,因为数组名已经表示数组的首地址了,他是个常量,你对这个常量取地址是何用意?所以,实际中还是不要进行这种运算。
[/Quote]
敢问依据?
sidney 2009-08-01
  • 打赏
  • 举报
回复
sizeof(&a)在gcc环境下,是4
在vc环境下是400
a表示数组a的首地址值,是个常量,对这个常量取地址(&a)表示什么标准C没有规定,由各编译器自行决定,所以,这种运算是不可移植的。另外,对数组名取地址也没有实际意思,因为数组名已经表示数组的首地址了,他是个常量,你对这个常量取地址是何用意?所以,实际中还是不要进行这种运算。
Synpeace 2009-08-01
  • 打赏
  • 举报
回复
这个函数的声明可以这样演化:

void fun(int b[100]);

void fun(int b[]);

void fun(int *b);

∴ 对于参数里的 b:sizeof(b) = sizeof(int*) = 4

如果是sizeof(::b),也就是对全局变量中的b进行sizeof,那结果将会是sizeof(int[100]) = sizeof(int) * 100 = 400
咸鱼一条007 2009-08-01
  • 打赏
  • 举报
回复
参数里面传进去的是地址
4字节。
Wijor 2009-08-01
  • 打赏
  • 举报
回复
呵呵,算了,结帖给分吧,大体算是明白了....谢谢大家啊....
Wijor 2009-08-01
  • 打赏
  • 举报
回复
谢谢楼上的,不过我个人觉得主要原因应该可能是形参int b[100]系统是不分配内存空间的吧....
ies_sweet 2009-08-01
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 wijor 的回复:]
引用 6 楼 cyldf 的回复:
int *p=null;
sizeof(p)的值是多少? //*p为指针,大小为4字节
sizeof(*p)呢? //*p为int类型,32位机上为4字节

int a[100];
sizeof(a)的值是多少? //a是大小为100的int数组,sizeof(a) = sizeof(int)*100 = 400
sizeof(a[100])呢? //尽管越界了,但是会把a[100]当int,所以为4
sizeof(&a)呢? //&a为数组a的地址,其空间大小为sizeof(int)*100=400
sizeof(&a[0])呢? //&a[0]为数组第一个元素的地址,相当于一个指针,大小为4

int b[100];
void fun(int b[100])
{
  sizeof(b);//sizeof(b)的值是多少? //这个应该为4吧,把b当作一个指针看
}


嘿嘿....不好意思,刚有点事出去了会...
6楼的,谢了啊,但最后个问题不是很明白,sizeof(b)究竟是多少啊 ?还有,是对前个数组b进行sizeof还是对参数里面的进行sizeof?
[/Quote]

因为一个数组被作为函数参数传递时,编译器会认为这是一个指针,
所以,进入函数后对这个变量取宽度,自然就是指针的宽度。

你可以狭义的认为C语言只支持两种形式的参数传递
整数(ANSIC 扩展了短类型)
指针
Wijor 2009-08-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 cyldf 的回复:]
int *p=null;
sizeof(p)的值是多少? //*p为指针,大小为4字节
sizeof(*p)呢? //*p为int类型,32位机上为4字节

int a[100];
sizeof(a)的值是多少? //a是大小为100的int数组,sizeof(a) = sizeof(int)*100 = 400
sizeof(a[100])呢? //尽管越界了,但是会把a[100]当int,所以为4
sizeof(&a)呢? //&a为数组a的地址,其空间大小为sizeof(int)*100=400
sizeof(&a[0])呢? //&a[0]为数组第一个元素的地址,相当于一个指针,大小为4

int b[100];
void fun(int b[100])
{
  sizeof(b);//sizeof(b)的值是多少? //这个应该为4吧,把b当作一个指针看
}
[/Quote]

嘿嘿....不好意思,刚有点事出去了会...
6楼的,谢了啊,但最后个问题不是很明白,sizeof(b)究竟是多少啊 ?还有,是对前个数组b进行sizeof还是对参数里面的进行sizeof?
xiaotaoqibao 2009-08-01
  • 打赏
  • 举报
回复
http://baike.baidu.com/view/1356720.htm
我建议你去这里看看,讲的蛮详细的
可能会对你有帮助
ies_sweet 2009-08-01
  • 打赏
  • 举报
回复
首先,建议楼主自己写出代码来跑跑看。

第2,建议楼主看一下 《C和指针》 《C专家编程》中关于数组和指针的描述。

第3,要理解C的指针,就需要了解一些编译原理。

其他的楼上几位朋友都说得很清楚了。

meipen 2009-08-01
  • 打赏
  • 举报
回复
完全同意6楼,说的很好
lijian22500 2009-08-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 cyldf 的回复:]
int *p=null;
sizeof(p)的值是多少? //*p为指针,大小为4字节
sizeof(*p)呢? //*p为int类型,32位机上为4字节

int a[100];
sizeof(a)的值是多少? //a是大小为100的int数组,sizeof(a) = sizeof(int)*100 = 400
sizeof(a[100])呢? //尽管越界了,但是会把a[100]当int,所以为4
sizeof(&a)呢? //&a为数组a的地址,其空间大小为sizeof(int)*100=400
sizeof(&a[0])呢? //&a[0]为数组第一个元素的地址,相当于一个指针,大小为4

int b[100];
void fun(int b[100])
{
  sizeof(b);//sizeof(b)的值是多少? //这个应该为4吧,把b当作一个指针看
}
[/Quote]

学习了
cyldf 2009-08-01
  • 打赏
  • 举报
回复
int *p=null;
sizeof(p)的值是多少? //*p为指针,大小为4字节
sizeof(*p)呢? //*p为int类型,32位机上为4字节

int a[100];
sizeof(a)的值是多少? //a是大小为100的int数组,sizeof(a) = sizeof(int)*100 = 400
sizeof(a[100])呢? //尽管越界了,但是会把a[100]当int,所以为4
sizeof(&a)呢? //&a为数组a的地址,其空间大小为sizeof(int)*100=400
sizeof(&a[0])呢? //&a[0]为数组第一个元素的地址,相当于一个指针,大小为4

int b[100];
void fun(int b[100])
{
sizeof(b);//sizeof(b)的值是多少? //这个应该为4吧,把b当作一个指针看
}
mu_yang 2009-08-01
  • 打赏
  • 举报
回复
sizeof(b);//sizeof(b)的值是多少?
------------------------------
明显是 sizeof(int *)
Vegertar 2009-08-01
  • 打赏
  • 举报
回复
指针大小一般与整数相当,32位机为4字节。sizeof (p) == 4
mu_yang 2009-08-01
  • 打赏
  • 举报
回复
这两个不好说
sizeof(&a)呢?
sizeof(&a[0])呢?
Vegertar 2009-08-01
  • 打赏
  • 举报
回复
我1楼的回复楼主可以无视了,sizeof 是编译时求值,p 是否为空无影响

#include <stdio.h>

int main() {
int *p = NULL;

typedef int test[sizeof (*p) == 4? -1: 1]; // 由编译信息可看出 sizeof (*p) == 4
}

Vegertar 2009-08-01
  • 打赏
  • 举报
回复
汗,sizeof(*p),楼主你够猛!

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧