C/C++指针详解

#include <iostream>

using namespace std;

int main(void)

{

    int a = 10;//定义一个变量a,赋值为10

    int *ap =&a; //将a的地址给指针ap;"&"--取地址的符号;

    cout<<"a= "<<a<<"; *ap ="<<*ap<<endl;//输出指针ap地址里的内容

    (*ap) = 100;

    cout<<"a= "<<a<<"; *ap ="<<*ap<<endl;//输出指针ap地址里的内容

    cout<<"ap= &a ="<<ap<<" ="<<&a<<endl;//ap 与 &a 是同一地址

    /**

      *此时的指针ap地址就是变量a的地址,ap所指向的地址里的内容就是a的值;

      *改变指针ap地址里的内容就是在改变a的值。

      */


    int b =100;                        //定义一个变量a,赋值为10

    int *bp = (int*)malloc(sizeof(int));//为指针bp分配内存

    *bp = b;                            //只是把b的值赋给了指针bp所指地址里的内容

    cout<<"b= "<<b<<"; *bp ="<<*bp<<endl;//Notice:值相同,地址不同

    cout<<"bp!= &b; "<<"bp = "<<bp<<";&b = "<<&b<<endl;

    (*bp) = 1000;                       //改变指针bp所指地址里的内容;它的改变与b无关

    cout<<"b= "<<b<<"; *bp ="<<*bp<<endl;

    cout<<"bp!= &b; "<<"bp = "<<bp<<";&b = "<<&b<<endl;

    /**

      *这样一来(通过动态内存分配),指针具有一般变量与指针的双重功能;

      *总之,指针的功能显得很强大。

      */

   

    ///下面的就不合法了,你可以试试运行一下(肯定是错误的)

    //  int c = 1000;

    //  int *cp;

    // *cp = c;//无法赋值,因为指针cp没有指向明确的地址

    //cout<<*cp;//无法输出

   

    return 0;

}

 

应用举例:

包含C++方面的一些知识。

#include <iostream>

using namespace std;
#include <string>
#include <cstdlib>
class Person
{
protected:
    string Name;
public:
    Person(string Name = "\0")
    {
        this->Name = Name;
    }
    virtual void Print()
    {
        cout<<"Person "<<Name<<endl;
    }
};


class Student : public Person
{
protected:
    int Number;
public:
    Student(int Number = 0,string Name = "\0"):Person(Name)
    {
        this->Number = Number;
    }
    virtual void Print()
    {
        cout<<"Student "<<Name<<' '<<Number<<endl;
    }
};


class Teacher : public Person
{
protected:
    int Year;
public:
    Teacher(int Year = 0,string Name = "\0"):Person(Name)
    {
        this->Year = Year;
    }
    virtual void Print()
    {
        cout<<"Teacher "<<Name<<' '<<Year<<endl;
    }
};

class Graduate : public Student
{
protected:
    string Research;
public:
    Graduate(string Research = "\0",string Name = "\0",int Number = 0)
        :Student(Number,Name)
    {
        this->Research = Research;
    }
    void Print()
    {
        cout<<"Graduate "<<Name<<' '<<Number<<' '<<Research<<endl;
    }
};

int _main_Person_virtual_function()
{
    int length;
    cin>>length;

    Person* *p = new Person*[length];
    for(int i = 0; i < length; ++i)
    {
        string obj_Name;
        string Name,Research;
        int Number,Year;

        cin>>obj_Name;
        if(obj_Name == "Person")
        {
            cin>>Name;
            p[i] = new Person(Name);
        }
        else if(obj_Name == "Student")
        {
            cin>>Name>>Number;
            p[i] = new Student(Number,Name);
        }
        else if(obj_Name == "Teacher")
        {
            cin>>Name>>Year;
            p[i] = new Teacher(Year,Name);
        }
        else if(obj_Name == "Graduate")
        {
            cin>>Name>>Number>>Research;
            p[i] = new Graduate(Research,Name,Number);
        }
        else
        {
            exit(EXIT_FAILURE);
        }
    }
    while(true)
    {
        string strTemp;
        cin>>strTemp;
        if(strTemp == "exit")
            break;
        int index = atoi(strTemp.c_str());
        if(index < 0 || index >= length)
            break;
        p[index]->Print();
    }

    for(int i = 0; i < length; ++i)
        delete p[i];
    delete p;

    return 0;
}
/**
4
Person Zhang
Student Zhao 200905
Graduate Li 200905 DataMining
Teacher Luo 10
**/


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值