char*,char[],与string 到底有何区别?

Yanger_xy 2009-02-26 07:14:51
#include <iostream> 
#include <fstream>
#include <string>
using namespace std;

int main()
{
struct Student
{
int number;
string name ;//如果我把这行改为string name就出错,为何?
float score;
};
Student stu[3] = {{110, "yang", 100}, {111, "xiao", 99}, {112, "ying", 98}};
ofstream outfile ("stud.dat", ios::binary|ios::out);
if (!outfile)
{
cerr < < "open error!" < < endl;
exit (1);
}
outfile.write ((char *) &stu[0], sizeof (stu));
for (int i = 0; i < 3; i++)
{
//outfile.write ((char *)&stu[i], sizeof (stu[i]));
cout < < stu[i].number < < endl;
cout < < stu[i].name < < endl;
cout < < stu[i].score < < endl < < endl;
}
outfile.close ();
return 0;
}

string与char *p还有char a[n]都能够输出一个字符串,但是有的时候三者好像并不是等价的,比如说上面的例子,我不知道什么时候应该用哪一个?!我一直认为这三者是等价的,可以互相替换,但是结果不然...
...全文
1069 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
normallife 2009-02-27
  • 打赏
  • 举报
回复
推荐你去看看以下网站:讲的很清楚,关于转换方面
http://hi.baidu.com/yuyudi/blog/item/0a1ed7ca34c2fd41f21fe79a.html
zgqiangha 2009-02-27
  • 打赏
  • 举报
回复
关注
fiyaa 2009-02-27
  • 打赏
  • 举报
回复
up,学习
tangshuiling 2009-02-27
  • 打赏
  • 举报
回复

楼主最主要的理解误区在于,认为string,char []都是字串的表达形式,应该string和char []相差无几
的确,从某中意义上来说,string就是字串,和char* char[]操作起来就那么回事,但string作为c++
中引入的类结构来说,差别还是蛮大的
string test;
sizeof(test) 如果是win32的系统应该是32
string test="lfjslfslkfjs";
sizeof(test) 仍然是32
char buffer[32];
sizeof(buffer); 其值为32
char buffer[64];其值为64
上面的简单语句说明什么问题? string结构的大小并不由字符的多少决定,那字符到底分配到哪里了呢?
答案就是,string结构中定义由char* ELE成员,这个ELE始终以指针的姿态存在,因此sizeof(ELE)始终
为4,这就是为何test的字符改变而sizeof的值不变的道理,而char* 由string类内部的内存分配器为其
开辟内存(至于在哪开辟内存,那是由string的实现决定)
如果简单的memcpy赋值给string类型,string内部的内存分配器永远都不会工作,字串永远不会被指针ELE
得到!
就讲那么多了,希望对楼主有所帮助!
visir 2009-02-27
  • 打赏
  • 举报
回复
出错的原因是
cout < < stu[i].name < < endl;
因为<<操作符没有参数为string 的重载
passionboy03 2009-02-27
  • 打赏
  • 举报
回复
up
[Quote=引用 3 楼 yangch_nhcmo 的回复:]
char* 字符指针,使用时需先申请空间,使用完后要记得释放;
char[] 字符数组,会自动分配空间,不需手动申请和释放;
string 由C++提供的字符串类,封装了字符串操作,比C语言的char*操作起来更安全;
[/Quote]
lingyin55 2009-02-26
  • 打赏
  • 举报
回复
mark 学习
王旺旺旺 2009-02-26
  • 打赏
  • 举报
回复
研究研究std::string,应该对char*能够有个概念的。
Yanger_xy 2009-02-26
  • 打赏
  • 举报
回复
我知道char* 是字符指针
char[] 是一个字符数组
string 是C++提供的字符串类
就是不知道什么时候用哪个?
...............

Yanger_xy 2009-02-26
  • 打赏
  • 举报
回复
还是不明白!!比如说下面的例子:

#include <iostream>
#include "headerfile1.h"
#include "headerfile2.h"
using namespace std;

int main ()
{
Ns1::Student stu1 (27, "yang", 100);
stu1.display ();
cout << Ns1::fun (2, 2) << endl;
Ns2::Student stu2 (28, "xiao", 99);
stu2.display ();
cout << Ns2::fun (2, 2) << endl;
return 0;
}

两个头文件分别是
//headerfile1

#include <iostream>
#include <string>
#include <cmath>
using namespace std;
namespace Ns1

{
class Student
{
public:
Student (int n, string nam, int a)
{
number = n;
name = nam;
age = a;
}
void display ()
{
cout << "number:" << number << endl;
cout << "name:" << name << endl;
cout << "age:" << age << endl;
}
private:
int number;
char * name;//字符指针,编译出错!!!
int age;
};

double fun (double a, double b)
{
return sqrt (a - b);
}
}


headerfile2:

#include <iostream>
#include <string>
#include <cmath>
using namespace std;
namespace Ns2

{

class Student
{
public:
Student (int n, string nam, float s)
{
number = n;
name = nam;
score = s;
}
void display ()
{
cout << "number:" << number << endl;
cout << "name:" << name << endl;
cout << "age:" << score << endl;
}
private:
int number;
char * name; //此处是指针!若改为字符数组也不行!@!!
float score;
};

double fun (double a, double b)
{
return sqrt (a + b);
}
}


这是错误报告!
error C2679: binary '=' : no operator defined which takes a right-hand operand of type 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char
> >' (or there is no acceptable conversion)
gsrdell 2009-02-26
  • 打赏
  • 举报
回复
char* 是字符指针
char[] 是一个字符数组
string 是C++提供的字符串类
yangch_nhcmo 2009-02-26
  • 打赏
  • 举报
回复
char* 字符指针,使用时需先申请空间,使用完后要记得释放;
char[] 字符数组,会自动分配空间,不需手动申请和释放;
string 由C++提供的字符串类,封装了字符串操作,比C语言的char*操作起来更安全;
hackers007 2009-02-26
  • 打赏
  • 举报
回复
char *p 字符指针
char a[n] 字符数组常见的c下面常见的字符串操作
而string是用C++ADT抽象而来
hemiya 2009-02-26
  • 打赏
  • 举报
回复
string 可以叫字符串类,只有c++
char *p 字符指针
char a[n] 字符数组

64,654

社区成员

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

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