社区
C语言
帖子详情
怎么理解:数组做 sizeof 的参数不退化,传递给 strlen 就退化为指针了
方紫涵
2012-06-19 09:49:58
怎么理解:数组做 sizeof 的参数不退化,传递给 strlen 就退化为指针了
退化是什么意思?
...全文
1456
31
打赏
收藏
怎么理解:数组做 sizeof 的参数不退化,传递给 strlen 就退化为指针了
怎么理解:数组做 sizeof 的参数不退化,传递给 strlen 就退化为指针了 退化是什么意思?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
31 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
iamnobody
2012-09-01
打赏
举报
回复
[Quote=引用 29 楼 的回复:]
引用 24 楼 的回复:
《C与指针》(中文版)165页--8.4总结:
“在绝大多数表达式中,数组名的值是指向数组第一个元素的指针。这个规则只有两个例外。sizeof返回整个数组所占用的字节而不是一个指针所占用的字节。单目操作符&返回一个指向数组的指针,而不是指向数组第一个元素的指针的指针”
======================
我记成三个例外了
就……
[/Quote]
++
飞天御剑流
2012-09-01
打赏
举报
回复
[Quote=引用 24 楼 的回复:]
《C与指针》(中文版)165页--8.4总结:
“在绝大多数表达式中,数组名的值是指向数组第一个元素的指针。这个规则只有两个例外。sizeof返回整个数组所占用的字节而不是一个指针所占用的字节。单目操作符&返回一个指向数组的指针,而不是指向数组第一个元素的指针的指针”
======================
我记成三个例外了
[/Quote]
就是有三种例外,《c和指针》漏掉了第三种情况:作为字符数组初始化器的字符串字面量。
此外,这本书在这里对数组名的描述也是有问题的。
lihuiluli
2012-09-01
打赏
举报
回复
[Quote=引用 25 楼 的回复:]
sizeof()是操作符,而strlen()是函数,数组做形参在函数传递,退化为指针。
[/Quote]
不管什么指针的大小都是4
aozhi
2012-08-29
打赏
举报
回复
第一sizeof是运算符,不是函数。它被包括在32个保留字了。函数标识符命名规则里怎么说的?不能和保留字重名!你这第一章是怎么学的呢?
既然不是函数,也就不存在数组退化成指针的问题。
另外不是带括号的就是函数。比如if(),return()等
cao_julians
2012-08-28
打赏
举报
回复
C对数组名的主要用法是将数组名视作首元素的地址----即&数组名[0]-----代码中绝大多数场合是这样的。
只有几个例外(好象是三个吧):
sizeof(数组名)
&数组名
??一时想不起来
这几个例外中,数组名代表整个数组,而不是首元素地址
BYD123
2012-08-28
打赏
举报
回复
[Quote=引用 11 楼 的回复:]
对于以数组为形参的函数,传过去之后实参都变成数组首地址。也就是退化。
因为sizeof不是一个函数,所以不退化。
[/Quote]
+1
sowhat_Ah
2012-08-28
打赏
举报
回复
[Quote=引用 17 楼 的回复:]
静态数组作为参数传入某个函数的时候,就会退化成指针,也就是该数组的首地址,其数组的长度信息就丢掉了,这就是在这个语境下退化的概念。
这也是为什么在将数组作为参数传递时,同时要将数组的长度也一并传入的原因。
[/Quote]
++
数组是有 首地址+数组长度 组成,传给函数做形参后,若只传了数组名,就相当于只传了数组的首地址,就退化成指针了,例如:char[10]传给某个函数做参数,就变成char*了,其中表示数组长度的10,就被丢弃掉了,所谓的数组退化了。
a1014143601
2012-08-28
打赏
举报
回复
[Quote=引用 12 楼 的回复:]
strlen只能用char* 做参数,且必须是以'\0'结尾
数组退化的问题可以用以下例子来说明
char str[20]="1234";
int a=strlen(str);
int b=sizeof(str);
结果
a=4;
b=20;
a的结果是从str这个char*指针开始一直到'\0'结束符之间的长度
b的结果是数组str所占用内存空间大小。
[/Quote]
a=4?
怎么觉得是5
misshare
2012-08-28
打赏
举报
回复
#include<stdio.h>
int main()
{
void *p;
printf("%d\n", sizeof(p));
}
这个结果是4,为什么呢?
天外淡云
2012-08-28
打赏
举报
回复
sizeof()是操作符,而strlen()是函数,数组做形参在函数传递,退化为指针。
cao_julians
2012-08-28
打赏
举报
回复
《C与指针》(中文版)165页--8.4总结:
“在绝大多数表达式中,数组名的值是指向数组第一个元素的指针。这个规则只有两个例外。sizeof返回整个数组所占用的字节而不是一个指针所占用的字节。单目操作符&返回一个指向数组的指针,而不是指向数组第一个元素的指针的指针”
======================
我记成三个例外了
tongzhipeng5699
2012-06-23
打赏
举报
回复
strlen只能用char* 做参数,且必须是以'\0'结尾
数组退化的问题可以用以下例子来说明
char str[20]="1234";
int a=strlen(str);
int b=sizeof(str);
结果
a=4;
b=20;
a的结果是从str这个char*指针开始一直到'\0'结束符之间的长度
b的结果是数组str所占用内存空间大小。
mymtom
2012-06-23
打赏
举报
回复
[Quote=引用 14 楼 的回复:]
sizeof( )是运算符,不是函数!它括号里的东东,是操作数,不是参数。
[/Quote]
sizeof 是操作符,操作数可以是一个表达式,或者带圆括号的类型名,例如:
但是一般来说,大家都用括号 sizeof(x), 像用函数一样使用sizeof()
int n;
printf("%d\n", sizeof n);
printf("%d\n", sizeof(int));
A_Zhao
2012-06-23
打赏
举报
回复
sizeof( )是运算符,不是函数!它括号里的东东,是操作数,不是参数。
super_admi
2012-06-23
打赏
举报
回复
退化的一般含义,在数学中见得比较多。如果某个东西,涉及到规则1,2,3,4,5;而经过一系列的变化后,只剩下规则1,3(原来规则中的几个),就称之为退化。
以上是我总结出来的退化的一般概念,或有不对,请大家指教。
kevinyank
2012-06-23
打赏
举报
回复
[Quote=引用 12 楼 的回复:]
strlen只能用char* 做参数,且必须是以'\0'结尾
数组退化的问题可以用以下例子来说明
char str[20]="1234";
int a=strlen(str);
int b=sizeof(str);
结果
a=4;
b=20;
a的结果是从str这个char*指针开始一直到'\0'结束符之间的长度
b的结果是数组str所占用内存空间大小。
[/Quote]
+1
pathuang68
2012-06-23
打赏
举报
回复
静态数组作为参数传入某个函数的时候,就会退化成指针,也就是该数组的首地址,其数组的长度信息就丢掉了,这就是在这个语境下退化的概念。
这也是为什么在将数组作为参数传递时,同时要将数组的长度也一并传入的原因。
stonehat
2012-06-23
打赏
举报
回复
我以前也不清楚,看了大家的说法,大致想了一下,是不是这样sizeof作为运算符,在处理sizeof(str)时,是将str作为一个字符串数组的名字来进行的,它得到这个字符数组的特性,即我们申明时的长度。而strlen则是函数,其参数应该是一个指向字符串的指针,它判断从这个指针开始到第一个'\0'的大小。
因此这句话就可以理解为,sizeof(str)、strlen(str)虽然看上去是一样的,但是含义却是不一样的,一个是字符数组名,一个是字符串指针。
景语
2012-06-20
打赏
举报
回复
对于以数组为形参的函数,传过去之后实参都变成数组首地址。也就是退化。
因为sizeof不是一个函数,所以不退化。
ljhhh0123
2012-06-20
打赏
举报
回复
int a[3];
这句话是C标准规定的。退化就是数组a在其它地方都是当整型指针对待。
加载更多回复(9)
初识C语言|一维
数组
的运用之——用
sizeof
和
strlen
来打怪?
本文主要介绍了
sizeof
和
strlen
在C语言一维
数组
中的应用。先阐述了二者的用法、
参数
、功能及返回值,接着通过“打怪闯关”的方式,分别对int型
数组
、char型
数组
和
指针
进行分析,给出不同代码示例的运行结果及详细解释,帮助读者
理解
其在
数组
中的运用。
C语言
数组
传参的致命误区,99%的人都没意识到的
指针
退化
问题
本文深入剖析C语言中
数组
传参时的
指针
退化
问题,揭示
数组
名在函数
参数
中
退化
为
指针
导致长度信息丢失的本质。通过
sizeof
与
strlen
行为对比、汇编视角分析及实验验证,阐明常见陷阱如误用
sizeof
计算
退化
指针
长度,并提出显式传长、结构体封装和VLA等安全实践方案。
C语言
数组
与
指针
的隐秘关系(函数
参数
传递
中的
退化
陷阱)
本文深入探讨了C语言中
数组
与
指针
之间的隐秘关系,重点分析了
数组
名在函数
参数
传递
中
退化
为
指针
的现象及其背后的设计原理。文章详细解释了
数组
与
指针
在内存布局、大小计算及性能影响上的区别,并针对一维和多维
数组
传参中的常见问题提出了有效的解决策略。同时介绍了如何通过显式
传递
长度、结构体封装、typedef等手段来规避
退化
陷阱。
C语言:从
sizeof
与
strlen
的实战对比,深度解析
数组
与
指针
的内存布局
本文深入对比C语言中
sizeof
运算符与
strlen
函数的本质区别:
sizeof
在编译期计算内存字节数,适用于
数组
、类型及
指针
本身;
strlen
在运行期遍历字符串至'\0',仅适用于以'\0'结尾的字符串。重点剖析
数组
与
指针
在内存布局上的差异,包括
数组
名
退化
规则、多维
数组
类型推导、函数
参数
中
数组
退化
陷阱,以及结构体对齐、动态内存等场景下的正确用法。
C/C++中
strlen
的用法
本文深入解析
strlen
函数的原理及应用,对比
strlen
与
sizeof
的区别,提供多种
strlen
函数的实现方式,帮助读者
理解
字符串长度计算的机制。
C语言
70,039
社区成员
243,246
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章