关于Sizeof

lbjfeng 2008-10-07 11:27:10
大家知道,
char acStr[10];
char* const pStr = acStr;


sizeof(acStr)的结果是10;
但是如果将acStr传入这个函数中的时候,

void func(char * p)
{
printf("当经过一次函数转化后,sizeof(acStr) = %d",sizeof(p));
}
他的运行结果是4

为什么那?sizeof两次使用的结果,里面的操作数都是一个指针,难道是区别在于是否为const?
那如果是sizeof(pStr)那,运行结果又会是多少那?
...全文
215 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
allenpettle 2008-10-08
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 blusunjava 的回复:]
确实退化成了指针,好像C缺陷与陷阱里面讲过了。
[/Quote]

对头,这本书很不错哦。
ludengyue 2008-10-08
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 phz1985 的回复:]
数组名做参数,退化为指针。
[/Quote]

agree
zhou_CC 2008-10-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 adriano119 的回复:]
当数组当作参数传递是实际上传递的是指针
[/Quote]
正解!!
linlan999 2008-10-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 bitxinhai 的回复:]
void func(char * p) ;
数组作为函数的参数,退化为指针!!!
[/Quote]

这样的声明
void  func(char p[10]);

数组作为函数的形参,将退化为指针

若数组作为实参,则将数组的地址传给形参
void func(char *p);
......
int main()
{
char c[10];
.....
func(c[10]);//此时p的值为数组c的首地址
}
lbjfeng 2008-10-08
  • 打赏
  • 举报
回复
感谢大家,大家也都说的很好。但是只是遗憾,奖励的分太少了,只能稍微给点,意思下
lbjfeng 2008-10-08
  • 打赏
  • 举报
回复
特别想买一本,但是没有钱了,5555

谢谢大家哦。现在小可是差不多明白了。
hyyuanqiang 2008-10-07
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zclever 的回复:]
首先,你那个输出是输出的sizeof{p};p是一个char*指针,这个肯定是4;
其次,就算你把acStr当成参数,输出还是4,因为当作为函数参数的时候,它已经退化成一个指针
C/C++ code#include<iostream>usingnamespacestd;voidf(charp[])
{
cout<<sizeof(p)<<endl;
}intmain()
{charp[15]="helloworld";
f(p);//输出4cout<<sizeof(p)<<endl;//输出15return0;
}
[/Quote]

的确如此、、、、、、、、、
原因我不知道。。。。。。。。。。。。。
估计也就是所谓的退化
zclever 2008-10-07
  • 打赏
  • 举报
回复
首先,你那个输出是输出的sizeof{p};p是一个char*指针,这个肯定是4;
其次,就算你把acStr当成参数,输出还是4,因为当作为函数参数的时候,它已经退化成一个指针

#include <iostream>
using namespace std;
void f(char p[])
{
cout<<sizeof(p)<<endl;
}
int main()
{
char p[15]="helloworld";
f(p);//输出4
cout<<sizeof(p)<<endl;//输出15
return 0;
}

星羽 2008-10-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 bitxinhai 的回复:]
void func(char * p) ;
数组作为函数的参数,退化为指针!!!


[/Quote]

指针大小在32位系统上是4
adriano119 2008-10-07
  • 打赏
  • 举报
回复
当数组当作参数传递是实际上传递的是指针
xuegao007 2008-10-07
  • 打赏
  • 举报
回复
在子函数中不能用sizeof判断p数组的大小,因为p只是个指针,sizeof(p)永远是4.
而acStr则不一样了,因为scStr和p类型不一样.
sizeof(pStr)==4.pStr也是指针.
bitxinhai 2008-10-07
  • 打赏
  • 举报
回复
void func(char * p) ;
数组作为函数的参数,退化为指针!!!

xianyuxiaoqiang 2008-10-07
  • 打赏
  • 举报
回复
因为后面一次sizeof算的是指针p的大小,指针p事实上占四个字节。
Big鹏 2008-10-07
  • 打赏
  • 举报
回复

1,第一个问题楼上的已经说了,是数组的首地址作为参数传递,被自动转换为指针了。
2,那如果是sizeof(pStr)那,运行结果又会是多少那?
回答:结果为4,因为指针是一地址,而地址占4个字节。
这部分知识很重要,请楼主好好看看。
kkndciapp 2008-10-07
  • 打赏
  • 举报
回复
传入函数后,数组名退化成指针
lbjfeng 2008-10-07
  • 打赏
  • 举报
回复
那数组指针区别于其他的指针的特点是什么,const特性?还是说还有其他的什么
  • 打赏
  • 举报
回复
楼主,在普通情况下,数组名指代的是一种数据结构,这种数据结构就是数组
在这种情况下 sizeof(str) 输出的结果是10,str指代数据结构char[10]

数组名作为函数参数时,他就沦为了普通的指针,
此时sizeof(str)求的是指针的长度,也就是指针占用内存的大小

在WNT32位平台下,指针的长度是4个字节

所以。。。。。
茻鄷 2008-10-07
  • 打赏
  • 举报
回复
类型不一样(char和char*),指针类型在32位系统中是4

changhairen 2008-10-07
  • 打赏
  • 举报
回复
pStr是指针,指向acStr[10]数组的首地址,说白了就是pStr存的数是acStr[10]的首地址(也就是acStr)。
sizeof(p)就是算指针的大小,win32指针大小都是4个字节。
wujiangxu 2008-10-07
  • 打赏
  • 举报
回复
数组的首地址作为参数传递,会被自动转换为指针
加载更多回复(6)

69,369

社区成员

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

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