关于函数字符数组调用问题

viperchaos 2011-01-09 05:10:02
我有一个函数调用原型是这样的:funtion(char s[])
用两种方法传递参数,一种可以,一种却不可以,麻烦高手指点是为什么的呢??谢谢拉

char test[16] = "110";
char *ptest = test;
.....
int funtion(char *ptest)



char *ptest = "110";
.....
int funtion(char *ptest)




...全文
575 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
viperchaos 2011-01-16
  • 打赏
  • 举报
回复
11楼讲得非常棒啊!!!
mnbqwe1 2011-01-10
  • 打赏
  • 举报
回复

char *ptest = "110";
.....
int funtion(char*&ptest)
NowDoIT 2011-01-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hnuqinhuan 的回复:]
char *ptest = "110";
ptest被"110"隐式的转换为const的了
[/Quote]

[Quote=引用 2 楼 tujiaw 的回复:]
这是一个指针常量值function里不能改变它的值
[/Quote]

++

参数是变量,传入为常量,这就是问题所在了吧!
熊主任 2011-01-10
  • 打赏
  • 举报
回复
楼上的,你讲得太深入浅出了:-)
lili_9809 2011-01-10
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 panda_lin 的回复:]
char *ptest = "110"; //这句话等于const char* ptest = "110";
.....
int funtion(char *ptest) //所以这里函数原形应写为int function(const char* ptest);
[/Quote]

首先对于字符串直接量,比如这里的"110",编译器编译后会将它们放入只读节中:
.section .rdata,"dr"
LC1:
.ascii "110\0"
.text

这样在运行该程序时,会将只读节映射到只读的段中。如果运行时更改只读段中的数据,则会出现“一般保护性异常”,通常程序会abort。

再说char *ptest = "110"; 要先搞清楚=两边的类型,左边是一个char*类型的指针,右边是一个字符串常量,它所代表的类型是char const*, char const*是不能直接赋值给char*的,如果你用gcc编译器,会出现一个警告:
warning: deprecated conversion from string constant to 'char*'
这就像C++中,const& 不能赋值为非const&一样。不过编译器没有把它当成一个错误,而是一个警告。这时ptest就指向了处于只读节中的数据。

再看看char test[16] = "110";这代表什么呢? test[16]是个char类型的数组,这条代码的作用是将处于只读节中的数据copy到了一份在test[16]数组中了。

你的函数原型是funtion(char s[]),实际上对于编译器而言,它等价于function(char* s),如果形参或实参是数组,它都会转化为指针。当你这样调用function(test)时,实参test是一个数组类型,这时它会退化成char*传递过去。



熊主任 2011-01-10
  • 打赏
  • 举报
回复
楼上的,你试着用g++编译一下这段code
function("110");
会有一个warning: deprecated conversion from string constant to 'char*'.
bluesky12312388 2011-01-10
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 panda_lin 的回复:]

char *ptest = "110";
//这句话等于const char* ptest = "110";
.....
int funtion(char *ptest)
//所以这里函数原形应写为int function(const char* ptest);
[/Quote]
理解不准确。
char *ptest = "110";
ptest 就是char *类型,至于错误应该
是函数内部改变了只读内存(即110所在的内存)
zhangsongcui 2011-01-10
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 panda_lin 的回复:]

char *ptest = "110"; //这句话等于const char* ptest = "110";
.....
int funtion(char *ptest) //所以这里函数原形应写为int function(const char* ptest);
[/Quote]
不能这么说,定义char *ptest那么ptest就是char*型,更改*ptest编译时不报错,运行时程序崩溃。
熊主任 2011-01-10
  • 打赏
  • 举报
回复
char *ptest = "110"; //这句话等于const char* ptest = "110";
.....
int funtion(char *ptest) //所以这里函数原形应写为int function(const char* ptest);
可乐崽 2011-01-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 swl82560397pq 的回复:]

char *ptest = "110";
.....
int funtion(char *ptest)

这个相当于ptest指向常量,而函数funtion中的形参是char *型,指向的内容能被改变,就不行。
[/Quote]

建议看一下:
http://blog.csdn.net/diamont1001/archive/2011/01/07/6123184.aspx
希望对你有用!
ningto.com 2011-01-09
  • 打赏
  • 举报
回复
这是一个指针常量值function里不能改变它的值
無_1024 2011-01-09
  • 打赏
  • 举报
回复
char *ptest = "110";
ptest被"110"隐式的转换为const的了
swl82560397pq 2011-01-09
  • 打赏
  • 举报
回复
char *ptest = "110";
.....
int funtion(char *ptest)

这个相当于ptest指向常量,而函数funtion中的形参是char *型,指向的内容能被改变,就不行。

69,374

社区成员

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

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