[置顶] C++ Primer 学习笔记_11_指针

指针



序言:

    指针是大多数C程序的重要组成部分,而且在许多C++程序中仍然受到重视!

    与迭代器的异同:指针结构更加通用一些,指针用于指向单个对象,而迭代器只能用于访问容器内的对象。

    由于指针用于低级操作,容易产生与繁琐细节相关的额错误,因此在现代C++程序中,尽量采用vector和迭代器取代一般的数组、指针,采用string类型取代C风格字符串。【P101



正文:

1、每个指针都有一个与之关联的数据类型,该数据类型决定了指针所指向的对象的类型。

[cpp] view plain copy print ?
  1. /* 
  2. *理解指针声明语句时,请从右往左读! 
  3. *指针的书写有几种书写方式,关键是要选择一种,并坚持使用下去! 
  4. */  
  5.     vector<int> *pvec;  
  6.     int *pi;  
  7.     string *pstr;  
  8.     double *pdou;  


2、指针可能的取值

    1)类型匹配对象的地址:&对象

    2)类型匹配对象的下一个地址:&(对象+1)

    30值常量表达式:NULL,例如,在编译时可以获得0值的整型const对象或字面值常量0.

    4)同类型的另一个有效的指针

[cpp] view plain copy print ?
  1. //示例  
  2.     int value = 1024;  
  3.     int *pi = 0;  
  4.     int *pi1 = &value;  
  5.     int *pi2 = pi;  
  6.     int *pi3;  
  7.     pi = pi2;  
  8.     pi3 = 0;  
  9.   
  10.     int zero = 0;  
  11.     int *p = zero;      //ERROR  
  12.     const int ZERO = 0;  
  13.     int *pz = ZERO;  
  14.   
  15.     int *pnull = NULL;  
  16.   
  17.     double val = 3.14;  
  18.     int *pv = &val; //ERROR  


3、拒绝使用”野指针”!

    很多运行时错误都源于使用了未初始化的指针。因为他很难被发现。

    如果使用未初始化的指针,会将指针中存放的不确定值视为内存地址,然后操纵该内存地址中保存的内容!

建议:

   1)、除非指向的对象已经存在,否则不要先定义指针。

   2)、在使用之前初始化所有变量,尤其是指针!

[cpp] view plain copy print ?
  1. //这就是在找死    *_*  
  2.     int *p;  
  3.     *p = 1;  



4void*指针

    void*表明该指针与一地址相关,但不清楚存储在该地址上的对象的类型!

void*指针只支持集中有限的操作:

   1)与另一个指针进行比较

   2)向函数传递void*指针或从函数返回void*指针。

   3)给一个void*指针赋值

千万不要使用void*指针操纵他所指向的对象!!!

[cpp] view plain copy print ?
  1. double val = 3.14;  
  2. int obj = 3;  
  3.   
  4. double *pval = &val;  
  5. void *pvoid = pval;  
  6. pvoid = &val;  
  7. pvoid = &obj;  


5、指针提供间接操纵其所指对象的功能

    1)解引用操作符返回指定对象的左值,利用这个功能可以修改所指对象的值。

[cpp] view plain copy print ?
  1. string str("Hello World");  
  2. string *ps = &str;  
  3. *ps = "NiHao ShiJie";  
  4. cout << str << endl;  


    2)也可以修改指针本身:

[cpp] view plain copy print ?
  1. string str("Hello World");  
  2. string *ps = &str;  
  3. string obj("NiHao ShiJie");  
  4. ps = &obj;  
  5. cout << *ps << endl;  

P105:关键概念:给指针赋值或通过指针进行赋值,值得仔细品读!】


6、指针与引用的差异

   1)定义引用时没有初始化是错误的。

   2)给引用赋值修改的是该引用所关联对象的值。

[cpp] view plain copy print ?
  1. string str("hello world");  
  2. string &rstr1;      //ERROR  
  3. string &rstr2 = str;  
  4. rstr2 = "nihao shijie";  
  5. cout << str << endl;  


[cpp] view plain copy print ?
  1. int ival = 1;  
  2. int ival2 = 2;  
  3. int &r1 = ival,&r2 = ival2;  
  4. r1 = r2;  
  5. cout << r1 << endl;  
  6. cout << ival << endl;  


7、指向指针的指针

[cpp] view plain copy print ?
  1. int ival = 1024;  
  2. int *pi = &ival;  
  3. int **ppi = &pi;  
  4.   
  5. cout << "ival is: " << ival  
  6.      << "\n*pi is: " << *pi  
  7.      << "\n**ppi is: " << **ppi << endl;  


   对指向指针的指针获取其真正的值,需要进行两次解引用!

[cpp] view plain copy print ?
  1. //P106 习题4.14  
  2. int main()  
  3. {  
  4.     int ival1 = 1024;  
  5.     int *pi = &ival1;  
  6.   
  7.     int ival2 = 2048;  
  8.     pi = &ival2;  
  9.     cout << *pi << endl;  
  10.   
  11.     *pi = 65536;  
  12.     cout << ival2 << endl;  
  13. }  


[cpp] view plain copy print ?
  1. //习题4.16 下列程序段实现什么功能?  
  2. int main()  
  3. {  
  4.     int i = 42,j = 1024;  
  5.   
  6.     int *pi = &i,*pj = &j;  
  7.     *pj = *pi * *pj;  
  8.     *pi *= *pi;  
  9.   
  10.     cout << "*pi = " << *pi << ", *pj = " << *pj << endl;  


你可能感兴趣的:(C++,C++,内存,数组,指针,Primer)