整合于以下两文章:http://blog.csdn.net/crazyboy2005/article/details/2292176
http://blog.csdn.net/zhuixundelang/article/details/1045153
#include <stdio.h>
#include <string.h>
using namespace std;
int main()
{
string a;
a[0]='a';
a[1]='/0';
printf("%s/n",a);
system("pause");
}
出错: [Warning] cannot pass objects of non-POD type `struct std::string' through `...'; call will abort at runtime
printf只能输出C语言内置的数据,而string不是内置的,只是一个扩展的类,这样肯定是链接错误的。string不等于char*,&a代表的是这个字符串的存储地址,并不是指向字符串的首地址,aa 对象中包含一个指向"string"的指针, &aar得到的是这个对象的地址,不是"string"的地址。
补充:问题: 偶尔在一些文字资料和 C++ 文档以及 Microsoft .NET 框架中看到术语“POD 类型”。这个术语是什么意思?
Shelby Nagwitz 答案: 你可以将 POD 类型看作是一种来自外太空的用绿色保护层包装的数据类型,POD 意为“Plain Old Data”(译者:如果一定要译成中文,那就叫“彻头彻尾的老数据”怎么样!)这就是 POD 类型的含义。其确切定义相当粗糙(参见 C++ ISO 标准),其基本意思是 POD 类型包含与 C 兼容的原始数据。例如,结构和整型是 POD 类型,但带有构造函数或虚拟函数的类则不是。 POD 类型没有虚拟函数,基类,用户定义的构造函数,拷贝构造,赋值操作符或析构函数。
正确的写法如下:
#include<iostream>
#include<string>
using namespace std;
void main()
{
string aa="qqq";
printf("%s",aa.c_str()); //不推荐
//或者cout<<a;
}