1、数组名是第一个元素的地址;

  2、指针保存的是另一个对象的地址;

  3、cout对象认为char的地址是字符串的地址,如果给cout提供一个字符的地址,则它将从该字符开始打印,直至遇到空字符为止;

  4、用引号括起来的字符串像数组名一样,也是第一个元素的地址;

  记住:在cout和多数C++表达式中,char数组名、指向char的指针以及用引号括起来的字符串常量都被解释为字符串第一个字符的地址.

  5、无法使用string对象初始化char指针,但是string类提供了一个名为c_str的成员函数,以实现此要求;

  6、可以使用指向char数组的指针,构造string对象,有不同的版本;

  7、使用一种容器的一对迭代器初始化另一种容器时,不要求两个容器类型相同。容器内的元素类型也可以不相同,只要它们相互兼容,能够将要复制的元素转换为所构建的新容器的元素类型,即可实现复制。


//9.28.cpp C++ Primer 5_CH
#include <iostream>
#include <vector>
#include <list>
#include <string>
using namespace std;


int main()
{
 char *sa="Allan";
 cout<<sa<<endl;
 //sa保存的是第一个字符的地址,对sa进行解引用得到第一个字符;
 cout<<*sa<<endl;
 char sb[]={'B','o','b'};
 //内存中有大量空字符
 cout<<sb<<endl;
 char sc[]={'S','a','m',''};
 cout<<sc<<endl;
 cout<<*sc<<endl;
 char *sar[]={"Allan","Tom","Peter","Raees","Umer"};

 //将(字符指针的)数组的一对迭代器传递给(字符指针的)列表,将列表初始化为
 //数组中的一段元素的副本
 list<char*> slst(sar,sar+5);
 vector<string> svec;

 string str1(sa);
 cout<<str1<<endl;

 //在VS2005上没有"预期的运行时错误"(C++ Primer)
 string str2(sb);
 cout<<str2<<endl;

 string str3(sc);
 cout<<str3<<endl;

 svec.assign(slst.begin(),slst.end());

 for(list<char*>::iterator lit=slst.begin();lit!=slst.end();++lit){
  cout<<*lit<<" ";
 }
 cout<<endl;

 for(vector<string>::iterator vit=svec.begin();vit!=svec.end();++vit){
  cout<<*vit<<" ";
 }
 cout<<endl;
 

 system("pause");
 return 0;
}

  运行结果: