数组名++

jxnuzhouguohong 2012-03-24 11:58:04


#include <stdio.h>
//#include <string.h>

char *str_cpy(char str1[],char str2[])
{
while(*str1++=*str2++);
str1=str1+1;
return str1;
}
int main()
{
char str1[]="jxnuzhouguohong";
char str2[]="come on";
str_cpy(str1,str2);
puts(str1);
return 0;


}



最近在琢磨传引用和动态分配内存的时候,想到了strcpy这个函数,如果形参是数组名的话,自增没问题,但是如果str++;不是说数组名是常量吗?怎么不报错呢?
...全文
278 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
猪头小哥 2012-03-24
  • 打赏
  • 举报
回复
这个问题很敏感~~
cao_julians 2012-03-24
  • 打赏
  • 举报
回复
函数的形参一定是变量。形参的char str[]和char *str没有本质区别。
写成数组形式只是强调函数中按数组处理各个元素,而写成指针变量形式还含有返回参数的意义。
调用函数时传递实参,实质上是用实参表达式的值对形参变量进行初始化。
在函数内用sizeof()可以检验出形参是指针变量还是数组。
鱼珊珊 2012-03-24
  • 打赏
  • 举报
回复
可以看看。。数组和指针的关系
数组退化成指针
iamnobody 2012-03-24
  • 打赏
  • 举报
回复
楼上说得不太严谨,楼主可以参考 <数组与指针>一书.
顺便看下我的签名.
iamnobody 2012-03-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jxnuzhouguohong 的回复:]

引用 3 楼 nacee 的回复:

数组名做参是自动退化为指针(非常量)。


为什么自动退化呢?
[/Quote]

因为数组不能直接复制,
int arr[3];
int b[3] = arr;//错的.不存在数组的 "="操作符.

于是C语言规定,数组可以隐式转换成首元素的指针,.通过元素指针来对数组元素(不是对数组整体)进行操作.

int[]这样的参数,因为不存在数组的复制操作,不能正确传参数,于是把它解释成指针.
nalisaki 2012-03-24
  • 打赏
  • 举报
回复
这个,教程都上都是那么说的,只知道这时,形参是按地址传递的,形参也可以当作指针变量,但具体就不是很了解了。感觉囹器应该做了一些工作,google一下吧。
jxnuzhouguohong 2012-03-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 nacee 的回复:]

数组名做参是自动退化为指针(非常量)。
[/Quote]

为什么自动退化呢?
nalisaki 2012-03-24
  • 打赏
  • 举报
回复
数组名做参是自动退化为指针(非常量)。
qixing1115 2012-03-24
  • 打赏
  • 举报
回复
char str1[],char str2[])在参数里已经是指针了吧?
char str2[]="come on";
str2++这样应该是有问题的吧
寒笑f 2012-03-24
  • 打赏
  • 举报
回复
数组名是地址吧。
jxnuzhouguohong 2012-03-24
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 mingliang1212 的回复:]

引用 7 楼 mingliang1212 的回复:

楼上说得不太严谨,楼主可以参考 <数组与指针>一书.
顺便看下我的签名.



2b了,,,是 <C 与指针>
[/Quote]

呵呵,国外的教材确实讲得很有道理,C Primer plus上也讲了这个。
iamnobody 2012-03-24
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 mingliang1212 的回复:]

楼上说得不太严谨,楼主可以参考 <数组与指针>一书.
顺便看下我的签名.
[/Quote]


2b了,,,是 <C 与指针>

69,368

社区成员

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

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