明天结贴,不分先后,谁答得全面给50分

darkstar21cn 2005-09-03 04:35:09
#include <string>
using std::string;
void func (char* const in);

int main ()
{
string str = "dklfjdslkfj";
func (str.c_str ());
return 0;
}
void func (char* const in)
{
}

问题自己找。。。。。
...全文
428 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
yhbttfile 2005-09-04
  • 打赏
  • 举报
回复
的确不值50分。~~
lzp729 2005-09-04
  • 打赏
  • 举报
回复
呵,这种问题也值50分?
jixingzhong 2005-09-04
  • 打赏
  • 举报
回复
const问题,改成void func (const char* in);
Jagen在路上 2005-09-04
  • 打赏
  • 举报
回复
void func (char* const in)
{
}

这里的参数没有必要这么声明,而且也不对。
根据就近匹配原则,const修饰了指针,说明指针不能修改,但是指针指向的数据可以被修改。但是这是属于指针的值传递,本来就修改不了指针的,在此处无任何意义。
然而string.c_str()返回的是const char*类型,这里的const修饰的是char,表明数据不可修改。那么自然const数据不能传递给mutable数据的,因此楼主的代码也是错误的。
由此可见,即多此一举又是错误。
darkstar21cn 2005-09-04
  • 打赏
  • 举报
回复
结贴。本来虚无说的不错,可惜没说完全,相比v41dugu(一步一生) 要全面一些,所以50分就给v41dugu(一步一生) 了。

另:
回复人: lyclowlevel(蓬蒿人) ( ) 信誉:100 2005-09-03 20:54:00 得分: 0
就是const char *不能赋值给char *或char const *

也许你在这也犯了个错误。还是那句“问题自己找”

补充说明:
纯粹灌水者无分


blocked_a_day 2005-09-04
  • 打赏
  • 举报
回复
好贴!
何哀何欢 2005-09-03
  • 打赏
  • 举报
回复
分多就很刁阿?还 “问题自己找”。。。

对了,另外的50分给谁?
lyclowlevel 2005-09-03
  • 打赏
  • 举报
回复
就是const char *不能赋值给char *或char const *
v41dugu 2005-09-03
  • 打赏
  • 举报
回复
对不起,我再补充一点。
如果这个问题是反过来的,就是 将char *const 指针(这里我们叫它p1)传给cosnt char*指针p2.
也就相当于p2=p1;他们同时指向了p1指向的那块内存,这样就没有错。因为p1是指向的那段内存的位置不能改变,而p2是指向的那段内存中的值不能变(也就是其本身可以变,就是它可以不指向这段内存了)。p2如果变化了不会使任何东西产生错误。也就是只要被要求为不能改变的东西不被改变就可以。这里p1指向的地址不能改变,而p2的变化并不会使p1指向的地址变化,所以没错。
而楼主的情况相当于这里的 p1=p2;他们同时指向了p2指向的内存。但是这块内存中的值被定义为不可改变的。所以出错。把两种情况对照起来理解
mituzhishi 2005-09-03
  • 打赏
  • 举报
回复
问题很明显,正如上面所讲的,改正如下:

#include <string>
using std::string;
void func (const char* in);

int main ()
{
string str = "dklfjdslkfj";
func (str.c_str ());
return 0;
}
void func (const char* in)
{
}
v41dugu 2005-09-03
  • 打赏
  • 举报
回复
问题应该就是那个const与非const的问题了
c_str()返回的是一个const char *类型的指针。而你把const char *指针传给char *const指针 当然错了哦
你要搞清楚在指针上面出现的const问题 ,只要你注意不能改变其原来的性质就行了
比如:const int a=1;int *p=&a;
这里就不对了。因为我们先定义了const int型的a.就表明了a 不能被改变,但是你用一个一般的指针p来指向a 的话,虽然不能通过变量名来改变a的值,但是却可以通过*p来改变a的值,所以这样是行不同的。
同样的在你的这个问题中.c_str()返回的const char *指针,而char *const指针是指针本身不能变化,而const char *指针本身是可以变化的,只是不能改变其指向的变量。所以如果传递成功的话,
那么那个 char *const指针就可以改变其指向的对象,但是const char *又说明了其指向对象是不可变的,所以出错
foochow 2005-09-03
  • 打赏
  • 举报
回复
template<class E,
class T = char_traits<E>,
class A = allocator<T> >
class basic_string
{
public:
.........
const E *c_str() const;
.......
protected:
A allocator;
};

一个const变量是不能赋值给一个非const变量的(const char*---->char*)......

别的不知道了,吃饭去....
antijpn 2005-09-03
  • 打赏
  • 举报
回复
是const char*而不是char* const,这个在C++里面肯定是不允许的,C里面默认最高应该是警告

其他的暂时没看出来……
zhouhuahai 2005-09-03
  • 打赏
  • 举报
回复
但是当你把const char *传给 char *const时,按照参数声明来说:
它会认为可以修改指针所指向的内容,这和const char *相矛盾.因此编译器拒绝接受.
zhouhuahai 2005-09-03
  • 打赏
  • 举报
回复
string( basic_string<char> )的c_str()的返回类型是: const char *
而你的func中的参数为char *const类型, 造成了类型不匹配的错误.

要改的话, 应该把func中的参数类型改成:
const char * 即:
void func (const char* in);

顺带提一下:改成这样之后,倒可以把一个char *传递进去.因为参数中的const只是一个指定,是说明在此函数中,不能改动参数(指针)所指向的内容

64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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