看书遇到的一个问题,求教。

I_code 2011-07-12 03:13:48

void test(char s[10])
{
s++;
}
int main()
{
char s[10];
// s++;//将注释删掉不能编译通过,为什么?
return 0;
}


产生问题的代码如上。
数组名本来就是指针main函数中s++不合法我很理解,因为数组名本来就不是左值。但是test里面的s++怎么就合法了呢?
代码运行的环境是VS2005
...全文
86 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
dianxinyanjiu 2011-07-12
  • 打赏
  • 举报
回复
主函数中s是数组名,代表的是该数组的首元素的地址,是个指针常量,显然不能做左值,因此在main函数中的s++是错误的
在test函数中,以数组作为形参其实就是以指针作为形参,void test(char s[10])等价于void main(char *s);因为在c语言中,用数组作为形参时,实际上就是以相应的形参作为指针变量。
这里注意:实参数组名代表的是一个固定的地址,是一个指针常量,而形参的数组并不是一个固定的地址,而是作为指针变量。如果你在主函数中调用test函数, test(char s[10]);此时就是将主函数中s[10]的首地址赋给了test函数中形参s;因为形参时一个指针变量,因此它在函数的运行期间可以被重新赋值。
fengzhw 2011-07-12
  • 打赏
  • 举报
回复
C函数当中的数组参数实际上是指针。
你分别在main和test当中,把sizeof(s)的值打印出来就知道了。

至于数组和指针的异同,在《C和指针》当中,描述得特别详细。
至善者善之敌 2011-07-12
  • 打赏
  • 举报
回复
// s++;//将注释删掉不能编译通过,为什么?


因为S是左值,不能++
也可以理解为常量。。

TEST里的S已经退化为指针了,指针式可以++
adw其 2011-07-12
  • 打赏
  • 举报
回复
主函数中的S++是数组的首地址,数组首地址是不能改变的,不能进行相加.//这个是确定的.
将数组作形参传进函数,此时,数组名相当数组的指什,可以改变,可以进行相加.
bdmh 2011-07-12
  • 打赏
  • 举报
回复
你那样不行,s是数组,当数组作为参数传递时,会退化为指针,你这不行
hai040 2011-07-12
  • 打赏
  • 举报
回复
参数都是退化成指针的
不过不确定char s[10]是char*还是char*const
这里能编译就是char*
金刚葫芦娃 2011-07-12
  • 打赏
  • 举报
回复
test(char s[10])
这时候相当于指针了,

69,371

社区成员

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

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