[置顶] C++ Primer 学习笔记_12_指针(续)



指针()



1、使用指针访问数组元素

    在C++中,数组与指针关系密切,当在表达式中使用数组名时,会自动将数组名转换成为指向数组的第一个元素的指针!

[cpp] view plain copy print ?
  1. int ia[] = {0,1,2,3,4,5,5};  
  2. int *ip = ia;  
  3. ip = &ia[4];  

2、指针的算术操作

    1)通常,在指针上加上/减去一个整数n,就获得了一个新的指针,该指针指向原指针的后面/前面的第n个元素。

[cpp] view plain copy print ?
  1.   int ia[] = {0,1,2,3,4,5,5};  
  2.   int *ip = ia;  
  3. cout << *(ip + 4) << endl;  

    2)只要两个指针指向的是同一数组,或者指向的是该数组的末端的下一个单元,C++还支持这两个指针做减法运算,结果类型为ptrdiff_t

    ptrdiff_tcstddef头文件中定义,该保证足以存放同一数组两个指针间的距离!

[cpp] view plain copy print ?
  1. ptrdiff_t n = ip2 – ip1;  

3、当使用下标访问数组时,其实就是使用下标访问指针

[cpp] view plain copy print ?
  1. int ia[] = {0,2,4,6,8};  
  2. int *p = &ia[2];  
  3. cout << p[1] << endl;  
  4. cout << p[-1] << endl;  

4、计算数组超出末端指针

    C++虽然允许计算数组或对象的超出末端的地址,但是不允许对该地址进行解引用操作,而计算数组超出末端位置之后,或数组首地址之前的地址都是不合法的!

[cpp] view plain copy print ?
  1. const int arr_size = 5;  
  2. int ia[arr_size] = {0,2,4,6,8};  
  3.   
  4. int *p = ia;  
  5. /* 
  6. *对q的解引用将得到无效值,但是对于大多数编译器来说, 
  7. *会把对q解引用的结果视为一个int型数据! 
  8. */  
  9. int *q = p + arr_size;  
  10. for (; p != q; ++p)  
  11. {  
  12.     cout << *p << endl;  
  13. }  

5、输出数组元素

[置顶] C++ Primer 学习笔记_12_指针(续)_第1张图片
[cpp] view plain copy print ?
  1. const size_t arr_sz = 5;  
  2. int int_arr[arr_sz] = {0,1,2,3,4};  
  3.   
  4. for (int *pbegin = int_arr,*pend = int_arr+arr_sz; pbegin != pend; ++pbegin)  
  5. {  
  6.     cout << *pbegin << endl;  
  7. }  

[cpp] view plain copy print ?
  1. //P110 4.18  
  2. int main()  
  3. {  
  4.     const size_t arr_sz = 5;  
  5.     int int_arr[arr_sz];  
  6.   
  7.     for (int *p = int_arr,*q = int_arr + arr_sz; p != q; ++p)  
  8.     {  
  9.         *p = 0;  
  10.         cout << *p << endl;  
  11.     }  
  12.   
  13. }  

6、指向const对象的指针

    不允许通过指针来修改其所指的const值。C++强制要求指向const对象的指针也必须具有const特性!

[cpp] view plain copy print ?
  1. const double *cptr;  

    const限定了cptr指针所指向的对象的类型,而并非cptr本身!

    可以把指向const的指针理解为“自以为指向const的指针”

[cpp] view plain copy print ?
  1. const double val = 3.14;  
  2. double *pval1 = &val;           //ERROR  
  3. const double *pval2 = &val; //OK  
  4.   
  5. double val = 3.14;  
  6. const double *pval = &val;      //OK  

[cpp] view plain copy print ?
  1. //示例  
  2. int main()  
  3. {  
  4.     double val = 3.14;  
  5.     const double *pval = &val;  
  6.     *pval = 2;  //ERROR  
  7.   
  8.     double *pval2 = &val;  
  9.     *pval2 = 1;  
  10.   
  11.     cout << *pval << endl;  
  12.     return 0;  
  13. }  

    在实际应用中:指向const对象的指针常用做函数的行参!


7const指针

    const指针---指针本身值不能修改,因此const指针必须在定义时初始化,而且初始化之后再也不能修改。【好专一啊(*^__^*)

    而指针所指对象的值能否修改,则完全取决于该对象的类型。

[cpp] view plain copy print ?
  1. int errNumb = 0;  
  2. int *const curErr = &errNumb;  
  3. *curErr = 1;        //OK  
  4. cout << errNumb << endl;  
  5.   
  6. int temp = 123;  
  7. curErr = &temp;     //ERROR  
  8. cout << *curErr << endl;  

8、指向const对象的const指针。

    既不能修改指针的值,也不能修改指针所指向对象的值。

[cpp] view plain copy print ?
  1. //示例  
  2.     const double val = 3.14;  
  3.     const double *const pval = &val;  
  4.   
  5.     double val = 3.14;  
  6.     const double *const pval = &val;  

9、指针和typedef

[cpp] view plain copy print ?
  1. //考虑下面的ERROR是为什么?  
  2.     typedef string *pstring;  
  3.     const pstring p;        //ERROR  
  4.     const string *q;        //OK  

    答疑:在C++中,const限定符既可以放在类型前面也可以放在类型后,即下面两条语句的作用是完全相同的!

[cpp] view plain copy print ?
  1. const string s;  
  2. string const s;  

[cpp] view plain copy print ?
  1. //示例  
  2.     string s;  
  3.     /* 
  4.     *下面的几条定义的作用是一样的! 
  5.     */  
  6.     typedef string *pstring;  
  7.     const pstring p1 = &s;  
  8.     pstring const p2 = &s;  
  9.     const string *p3 = &s;  
  10.     string const *p4 = &s;  

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