怎么理解:数组做 sizeof 的参数不退化,传递给 strlen 就退化为指针了

方紫涵 2012-06-19 09:49:58
怎么理解:数组做 sizeof 的参数不退化,传递给 strlen 就退化为指针了

退化是什么意思?
...全文
1330 31 打赏 收藏 转发到动态 举报
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)

70,023

社区成员

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

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