指针数组结构


 

P82

在字符串里不能有“真正的”换行;

为了使程序比较整洁,可以将长字符串用空白(换行符、制表符)断开,编译器将拼接起连续的字符串~

#include <iostream>                                                                                     
using namespace std;
int main ( ) {
  /*********************** 错误例子 ***************************/
  char wa[] = "abcd
    efgh
    wxyz";
  cout << wa << endl;

  /*********************** 正确例子 ***************************/
  char alpha[] = "abcd"
    "efgh"
    "ijklmn"
    "opqrstuvwxyz";
  cout << alpha << endl;
}

 


 

 

P85

关键字const可以加到一个对象的声明上,将这个对象声明为一个常量。因为不允许赋值,常量在声明时就必须初始化。

注意:const实际上改变了类型,也就是说,它限制了对象能够使用的方式。

#include <iostream>
using namespace std;
int main ( ) {
  /*********************** 错误例子 ***************************/
  const double pi;
  pi = 3.14;
  cout << pi << endl;

  /*********************** 正确例子 ***************************/
  const int maxn = 888;
  cout << maxn << endl;                                                                                 
}

 

P87

指针常量 与 常量指针 (xx书的shit一样的中文翻译)

技巧:从右往左读。

  char *const cp;   //cp is a const pointer to char
  char const* pc;   //pc is a pointer to char const                                                     
  const char* pc2;  //pc2 is a pointer to char const

 

cp是一个const pointer;

pc和pc2都是指向char const的普通指针,这两个没有区别。

下面是书中的一个例子,注释稍加修改:

void f1(char* p) {
  char s[] = "Gorm";

  const char* pc = s;         //pc指向const
  pc[3] = 'g';                //错误:pc是指向的char是常量
  pc = p;                     //ok

  char *const cp = s;         //cp是const指针
  cp[3] = 'a';                //ok                                                                      
  cp = p;                     //错误:cp是const

  const char *const cpc = s;  //到const的const指针
  cpc[3] = 'a';               //错误:cpc指向const
  cpc = p;                    //错误:cpc本身是const
}

 

可以将一个变量的地址赋给一个指向常量的指针,因为这样做不会造成任何伤害。

当然,不能将常量的地址赋值给一个未加限制的指针,因为这样做将会允许修改该对象的值了。例如:

void f4() {
  int a = 1;
  const int c = 2;
  const int* p1 = &c; //ok                                                                              
  const int* p2 = &a; //ok

  int* p3 = &c;       //错误:用const int*对int* 进行初始化
  *p3 = 7;            //试图修改c的值
}

 

 


 

P88

一个引用就是某对象的另一个名字。引用的主要用途是为了描述函数的参数和返回值,特别是为了运算符的重载。

为了确保一个引用总能约束到某个对象,规定必须对引用做初始化

  int ii = 0;
  int& r1 = ii;   //正确
  int& r2;        //错误:没有初始化          

 

 

引用还可以用于定义一些函数,试它们既可以被用在赋值的左边,也可以用在赋值的右边。。(意思是函数的返回值是引用)

例子:   

#include <iostream>
#include <string>
#include <vector>
using namespace std;
struct Pair {
  string name;
  double val;
};
vector<Pair> pairs;
//维护Pair的一个集合
//检索s,如果找到就返回其值;否则做一个新Pair并返回默认值0
double& value(const string& s) {                                                     
  for(int i = 0; i < pairs.size(); ++i )
    if(s == pairs[i].name) return pairs[i].val;
  Pair p = { s, 0 };
  pairs.push_back(p);
  return pairs[pairs.size()-1].val;
}
int main ( ) {
  string buf;
  while(cin >> buf) value(buf)++;
  for(vector<Pair>::const_iterator p = pairs.begin(); p != pairs.end(); ++p)
    cout << p->name << ": " << p->val << '\n';
}

 

 

 


 

 

P92

结构体

数组是相同类型的元素的一个聚集。一个struct则是任意类型元素的一个聚集。

定义struct类型时,请注意最后的分号。。。

用于对数组初始化的形式也适用于初始化结构体类型的变量~

#include <iostream>
using namespace std;
struct address {
  char* name;
  int number;
  char* street;
  char* town;
  char state[2];
  int zip;
};
int main ( ) {
  address jd = { "Jim Dandy", 61, "South St", "New Provience", { 'N', 'J' }, 7974 };
} 

 

 

 


 

 

 

 

posted on 2013-06-27 22:18  Ac_coral  阅读(296)  评论(1编辑  收藏  举报

导航