社区
C语言
帖子详情
怎么理解:数组做 sizeof 的参数不退化,传递给 strlen 就退化为指针了
方紫涵
2012-06-19 09:49:58
怎么理解:数组做 sizeof 的参数不退化,传递给 strlen 就退化为指针了
退化是什么意思?
...全文
1330
31
打赏
收藏
怎么理解:数组做 sizeof 的参数不退化,传递给 strlen 就退化为指针了
怎么理解:数组做 sizeof 的参数不退化,传递给 strlen 就退化为指针了 退化是什么意思?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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
区别
本文介绍的是
sizeof
与
strlen
区别
sizeof
与
strlen
区别详解
c语言中最常遇到的问题是字符串处理问题,特别是字符串长度:
sizeof
与
strlen
.两者使用时一定要区分开,否着会很容易出错。本文对两者的区别
做
了详细介绍。
Sizeof
与
Strlen
的区别与联系
Sizeof
与
Strlen
的区别与联系.。
字符
数组
字符
指针
sizeof
strlen
的一点总结
字符
数组
字符
指针
sizeof
strlen
的一点总结
深入
理解
Sizeof
深入
理解
Sizeof
C语言
70,023
社区成员
243,263
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章