发布日期:2015-12-22 13:33 来源: 标签: 编程语言 C++教程new和delete C++指针&和* C++字符串数组及指针
本章我们主要通过一些实例学习C++中&和*操作符、new和delete操作符、动态数组、字符串和地址及数组和指针,下面我们就做一下具体讲解,希望大家多多支持中国站长网络学院。
一、&和*操作符
    #include
    int main()
    {
        using namespace std;
        int updates = 6;
        int *p_updates;
        p_updates = &updates;
        cout<<"Values: updates = "<<updates;
        cout<<", *p_updates = "<<*p_updates<<endl;
        cout<<"Address: &updates = "<<&updates;
        cout<<",p_updates = "<<p_updates<<endl;
        *p_updates = *p_updates + 1;
        cout<<"Now updates = "<<updates<<endl;
    }
二、    
    #include
    int main()
    {
        using namespace std;
        int higgens = 5;
        int* pt = &higgens;//是对pt进行赋值,而不是*pt。等价于int* pt; pt = &higgens;
        cout<<"Value of higgens = "<<higgens<<endl;
        cout<<"Addnress of higgens = "<<&higgens<<endl;
        cout<<"Value of *pt = "<<*pt<<endl;
        cout<<"Value of pt = "<<pt<<endl;
        return 0;
    }
三、new和delete操作符
    #include
    int main()
    {
        using namespace std;
        int* pt = new int;
        *pt = 1001;
        cout<<"int value = "<<*pt<<",and location = "<<pt<<endl;
        double* pd = new double;
        *pd = 5.234;
        cout<<"double value = "<<*pd<<",and location = "<<pd<<endl;
        delete pt;
        delete pd;
        return 0;
    }
四、动态数组
    #include
    int main()
    {
        using namespace std;
        double* p3 =  new double[3];
        p3[0] = 0.2;
        p3[1] = 0.5;
        p3[2] = 0.8;
        cout<<sizeof(p3)<<endl;
        cout<<"p3[1] is "<<p3[1]<<".\n";
        p3 = p3 + 1;//增加一位地址,这里的一位的单位标准是按照数组的一个元素占内存的字节数。
        cout<<"Now p3[0] is "<<p3[0]<<" and p3[1] is "<<p3[1]<<".\n";
        cout<<sizeof(p3)<<endl;
        p3 = p3 -1;
        delete[] p3;
        return 0;
    }
五、数组和指针
    #include
    int main()
    {
        using namespace std;
        double wages[3] = {10000.0,20000.0,30000.0};
        short stacks[3] = {3,2,1};
        //两种方式去获取数组的地址——数组名或对数组首元素进行求址运算
        double* pw = wages;
        short* ps = &stacks[0];
        cout<<"pw = "<<pw<<",*pw = "<<*pw<<endl;//打印出数组第一个元素的值和地址
        pw = pw + 1;
        cout<<"add 1 to the pw pointer:\n";
        cout<<"pw = "<<pw<<",*pw = "<<*pw<<"\n\n";
        cout<<"ps = "<<ps<<",*ps = "<<*ps<<endl;//打印出数组第一个元素的值和地址
        ps = ps + 1;
        cout<<"add 1 to the ps pointer:\n";
        cout<<"pw = "<<ps<<",*ps = "<<*ps<<"\n\n";    
        //stacks[1] 等同于 *(stacks + 1)
        cout<<"access two elements with array notation\n";
        cout<<" stacks[0] = "<<stacks[0]<<", stack[1] = "<<stacks[1]<<endl;
        cout<<"access two elements with pointer notation\n";
        cout<<"*stacks = "<<*stacks<<",*(stacks + 1) = "<<*(stacks + 1)<<endl;
        cout<<sizeof(wages)<<" = size of wages array\n";    //24字节
        cout<<sizeof(pw)<<" = size of pw pointer\n";            //4字节
        return 0;
    }
六、字符串和地址
    #include
    int main()
    {
        using namespace std;
        char flower[10] = "rose";
        //字符串发送地址给cout对象。
        //在cout和多数C++表达式中,char数组名、指向char的指针以及用引号括起来的字符串常量都被解释为字符串第一个字符的地址
        cout<<flower<<"s are red.\n";
        return 0;
    }
七、字符串和地址
    #include
    #include
    int main()
    {
        using namespace std;
        char animal[20] = "bear";
        const char* bird = "wren";//bird存放字符串的地址
        char* ps;
        cout<<animal<<" and ";
        cout<<bird<<"\n";
        cout<<"Enter a kind of animal:";
        cin>>animal;
        //cin>>ps;//没有为ps分配内存空间,这样做是错误的
        ps = animal;//ps和animal指向同一个string和内存单元
        cout<<ps<<"s!\n";
        cout<<"Before using strcpy():\n";
        cout<<animal<<" at "<<(int*)animal<<endl;//计算animal的地址,如果是char*类型,则打印出字符串
        cout<<ps<<" at "<<(int*)ps<<endl;
        ps = new char[strlen(animal) + 1];//分配新的内存空间
        strcpy(ps,animal);//数组拷贝,如果这里把animal赋给ps,这样将改变ps的地址,我们将无法操作新分配的内存
        cout<<"After using strcpy():\n";
        //虽然animal和ps指向的是同一个string,但是它们的内存地址是不同的
        cout<<animal<<" at "<<(int*)animal<<endl;
        cout<<ps<<" at "<<(int*)ps<<endl;
        delete[] ps;
        return 0;
    }
八、动态结构 ->指向操作符
    #include
    struct inflatable
    {
        char name[20];
        float volume;
        double price;
    };
    int main()
    {
        using namespace std;
        inflatable* ps = new inflatable;//在运行时分配内存
        cout<<"Enter name of inflatable item:";
        cin.get(ps->name, 20);
        cout<<"Enter volume in cubic feet:";
        cin>>(*ps).volume;
        cout<<"Enter price:$";
        cin>>ps->price;
        cout<<"Name:"<<(*ps).name<<endl;
        cout<<"Volume:"<<ps->volume<<" cubic feet\n";
        cout<<"Price:$"<<ps->price<<endl;
        delete ps;
        return 0;
    }
九、指针的值(或称指针所指向的内存区)
指针的值或者叫指针所指向的内存区或地址,是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值。在32位程序里,所有类型的指针的值都是一个32位整数,因为32位程序里内存地址全都是32位长。 指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为sizeof(指针所指向的类型)的一片内存区。以后,我们说一个指针的值是XX,就相当于说该指针指向了以XX为首地址的一片内存区域;我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。
指针所指向的内存区和指针所指向的类型是两个完全不同的概念。在上例中,指针所指向的类型已经有了,但由于指针还未初始化,所以它所指向的内存区是不存在的,或者说是无意义的。
十、指针本身所占有的内存区
指针本身所占有的内存区是指针本身占内存的大小,这个你只要用函数sizeof(指针的类型)测一下就知道了。在32位平台里,指针本身占据了4个字节的长度。
指针本身占据的内存这个概念在判断一个指针表达式是否是左值时很有用。

相关评论

专题信息
    C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛。C++支持多种编程范式 --面向对象编程、泛型编程和过程化编程。最新正式标准C++于2014年8月18日公布。 其编程领域众广,常用于系统开发,引擎开发等应用领域,是至今为止最受广大程序员受用的最强大编程语言之一,支持类:类、封装、重载等特性! 本教程从基础讲解了C++语言,希望对大家有所帮助,望多多支持中国站长网络学院。