C++语言解读

本章共分

一:指针

二:引用

三:函数深入

四:运算符重载

五:C++中的继承

六:虚函数

七:链表

八:多态性

九:代码重用

 

一:指针

   1:什么是指针

   2:用指针怎么保存地址

   3:空指针

   4:指针与类型

   5:用指针访问值

   6:指针容易混淆的概念

   7:指针的算术

   8:指针与数组

   9:栈与堆得概念(指针的new)

   10:用指针创建对象

   11:常量指针

   12:指向常量的指针

 

1.1 什么是指针
        指针是一种专门保存变量地址的变量
    怎么定义指针 请看例子
       

#include<iostream>
       using namespace std;
       //定义指针
        int main(){
 int* p;//这里定义一个指向int类型的指针,也可以int *p这样定义
 return 0;
       }


   
1.2   用指针怎么保存地址

      

 #include<iostream>
       using namespace std;
       //用指针怎么保存地址
       int main(){
 int a=30;
 int* p=&a;// &运算符是取地址运算符(任何类型都可以用&取地址)
 cout<<"p:"<<p<<endl; //输出P保存的地址
 cout<<"&a:"<<&a<<endl;//同样输出&a地址查看
 return 0;

 //输出结果大致为
         
//p:0012ff7c
 
//&a:0012ff7c
     }


    那么怎样用指针访问值呢?下面会解答

3:空指针
     大家必须要记住一点:使用指针必须初始化.如果暂时不知道把指针指向什么地方,可以用0来初始化该地

址。这样就不会出现意料不到的地方
   

 #include<iostream>
    using namespace std;
    //空指针
    int main(){
 int* p=0;
 return 0;
    }

 

 

4:指针与类型
   使用指针初始化时变量类型必须与指针指向的类型相同。请看代码
 

#include<iostream>
  using namespace std;
  //指针类型
  int main(){
 int a=30;
 double b=20.4;
 int* p=&a;  //正确
 int* p=&b;  //错误,类型不正确
 return 0;
  }


5:用指针访问值
     用指针怎么访问值呢?请看代码 
  

#include<iostream>
   using namespace std;
   //指针访问值
   int main(){
 int a=30;
 int* p=&a;
 cout<<*p<<endl;//请注意:这里的*是运算符重载(间接引用,而非定义指针或乘法运算)
 return 0;
   }


6:指针容易混淆的概念
    指针有3个概念会大家混淆
       1: 指针自身的地址
       2:指针所保存的地址
       3:指针所保存地址的值
    还是用例子来说明

   

#include<iostream>
    using namespace std;
    //指针容易混淆的概念
    int main(){
 int a=30;
 int b=20;
 int* p=&a;
 cout<<"p自身地址:"<<&p<<endl;//输出p自身的地址
 cout<<"p指向的变量地址:"<<p<<endl;//p指向变量的地址
 cout<<"*p值:"<<*p<<endl;//输出值
 p=&b;
 cout<<"改变指针指向后输出指针自身地址:"<<&p;
 return 0;
 /*
    输出结果如下
     p:自身地址:0012ff74
            p指向的变量地址:0012ff7c
            *p的值:30
           改变指针指向后输出指针自身地址:0012ff74
 
*/
  }


大家可以看见,无论如何定义指针指向,指针本身地址不会再次改变呢

 

7:指针的算术
    指针算术有一点点不同,请看例子
    

#include<iostream>
    using namespace std;
   //指针的算术
   int main(){
 int a=30;
 int*p=&a;
 cout<<"p:"<<p<<endl;
 p++;//自加1
        cout<<"p:"<<p<<endl;
 return 0;
 /*
    输出
    p:0012ff7c;
    p:0012ff80;
    
 
*/
   }

   我们可以用十六精制计算器两个输出两个对象相减会发现差值是4而不是1,这个4是什么?和int型有何联系??请大家自行测试

 

 

8:指针与数组
   指针和数组有太大的关系,我们可以说数组就是指针,指针就是数组。为什么这么说呢?因为大部分情况下数组名保存的就是一个地址。请看例子代码

#include<iostream>
using namespace std;
//指针与数组
int main(){
 int shu[]={1,2,3,4,5};
 cout<<shu<<endl;//直接输出数组名
 int*p=shu;
 cout<<p<<endl;//输出地址
 cout<<"指针访问数组元素:"<<p[1]<<endl;
 cout<<" 数组名访问数组元素:"<<shu[1];
 cout<<"这里输出是什么?:"<<(*p)<<endl;
 cout<<"这里输出和上面一行和何联系呢?:"<<p[0]<<endl;
 p++;
 cout<<p<<endl;//这里进行自加后会输出什么
 cout<<&(p[1])<<endl;//这里输出和上面一行有何联系??
 return 0;
 /*
      
 
*/
}



我们可以得出个结论,数组名保存的是数组第一个值的地址,当指针自加1后,实际上是加了该类型的字节数,这样指指自加就等于是指向下一个数组元素.关于数组和指针还有很多联系,我们将到数组时会具体介绍

 

 

9:栈与堆得概念
    这个概念如果不介绍的话,下面的话题会有所不了解的。关于变量存储的位置分很多,我们这里就说栈与堆。
   栈位置是什么:  class a;//这种形式存储a变量的地址就是放在栈里面的,栈里面数据是自动回收的.不需要我们手动回收
 
  堆位置是什么: class* p=new class;//这种形式就是存放在堆里面。堆有点不同的是它不会自动回收,我们必须手工进行释放。
怎么释放:delete p;注意一点,用new 关键字在进行创建对象时必须要delete释放.这点和我们所学的C#不同,C#是垃圾自动回收机制的.
为了测试这个意思。我们可以写个例子来说明
class a{
  public:
    a(){cout<<"构造触发了";}
    ~a(){cout<<"析构触发了";}
}
 大家可以定义两个对象
a  aa;
a* p=new a;来进行这样的测试就会发现不同点呢。

明天继续 

posted @ 2011-12-06 13:35  依人  阅读(1659)  评论(5)    收藏  举报