社区
C语言
帖子详情
怎么理解:数组做 sizeof 的参数不退化,传递给 strlen 就退化为指针了
方紫涵
2012-06-19 09:49:58
怎么理解:数组做 sizeof 的参数不退化,传递给 strlen 就退化为指针了
退化是什么意思?
...全文
1420
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)
sizeof
与
strlen
区别详解
c语言中最常遇到的问题是字符串处理问题,特别是字符串长度:
sizeof
与
strlen
.两者使用时一定要区分开,否着会很容易出错。本文对两者的区别
做
了详细介绍。
Sizeof
与
Strlen
的区别与联系
Sizeof
与
Strlen
的区别与联系.。
深入
理解
Sizeof
深入
理解
Sizeof
Sizeof
运算符与
Strlen
函数的区别与联系.docx
。。。
后端,面试,c++ ,找工作
##
sizeof
和
strlen
的区别
sizeof
是一个操作符,
strlen
是库函数。
sizeof
的
参数
可以是数据的类型,也可以是变量,而
strlen
只能以结尾为‘0‘的字符串作
参数
。 编译器在编译时就计算出了
sizeof
的结果。而
strlen
函数必须在运行时才能计算出来。并且
sizeof
计算的是数据类型占内存的大小,而
strlen
计算的是字符串实际的长度。 *
数组
做
sizeof
的
参数
不
退化
,
传递
给
strlen
就
退化
为
指针
了。* ## C中的malloc和C++中的new有什么区别 malloc和new有以下不同: (1)new、delete是操作符,可以重载,只能在C++中使用。 (2)malloc、free是函数,可以覆盖,C、C++中都可以使用。 (3)new可以调用对象的构造函数,对应的delete调用相应的析构函数。 (4)malloc仅仅分配内存,free仅仅回收内存,并不执行构造和析构函数 (5)new、delete返回的是某种数据类型
指针
,malloc、free返回的是void
指针
。 注意:malloc申请的内存空间要用free释放,而new
C语言
70,040
社区成员
243,246
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章