C++学习 指针和引用

来源:互联网 发布:新加坡 人工智能 编辑:程序博客网 时间:2024/06/04 17:55

部分参考百度

================================指针==================================指针可以初始化为0 如 int *p=0; 使之不至于成为失控指针数据在内存中的存放方式:栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值 连续的内存空间堆区(heap):由程序员分配释放  不连续的内存空间 由链表串联起来寄存器区:用来保存栈顶指针和指令指针全局区(静态区):全局变量和静态变量的存储时放在一起的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,程序结束由系统释放。文字常量区:常量字符串存放位置,程序结束后由系统释放程序代码区:存放函数体的二进制码C++使用关键字 new 创建一个堆,并分配内存使用 new 创建的内存空间不会被系统自动释放必须在使用 delete 释放该指针所指向的内存 但是这不会释放指针,因此还可以再次使用该指针(不要重复删除,会是程序崩溃,删除空指针是安全的)当用 delete 释放一个指针所指向的空间后。最好将该指针中保存的内存地址清0,以免重复操作该地址,导致错误。常量指针:#include<iostream>using namespace std;class A{public:int getValue(){ return x;}void setValue(int para){x = para;}private:int x;};int main(void){A *a = new A;cout<<a<<endl;    0x30F98cout<<a+1<<endl;  0x30F9c A *p = new A;p->setValue(11);cout<<p->getValue()<<endl;return 0;}【辨析:常量指针 与 指针常量】常量指针与指针常量是C语言中两个比较容易混淆的概念:(1) const char* p;(2) char* const p=a;(3) char* p="abc";(1)式定义了一个常量指针,即指向一个常量的指针,指向的内容是常量,不可修改,放在常量区的,但指针本身可以修改,即*p='b',是非法的,*p是p指向的常量的第一个字符,是个常量,不能改变的。p=&q这是可以的,指针可以指向不同的地址int a,b;const int *p = &a;//常量指针    *p不可修改 *p = 8;(ERROR)                                  p 可以修改 p = &b  (OK)(2)式定义了一个指针常量,即指针本身是个常量,不可修改,但指针指向的内容可以修改,一开始定义时让它指向数组a. *p='b'这是可以的,但p=&b是非法的。int a;int * const p = &a    //指针常量  *p可以修改*p = 8;(OK)                                   p不可以修改 p++(ERROR) const char*p 即char*p是个常量,所以内容是常量。 char* const p; 即指针p是个常量。(3) char*p定义的是一个指针变量p,指向字符串abc的首地址。这里特别要注意,在C语言中,(3)式定义的是一个常量字符串,它被放在静态存储区的常量区进行存储,而p是一个指针变量,放在栈上。如果*p='b',在编译时能通过,但在运行时就会出现错误,因为你试图去改变常量区的内容。const int * const p = &a;    // *p 和 p均不可改变了================================引用==================================引用就是别名对象的别名:#include<iostream>using namespace std;class man{public:    int get() {return i;}    void set(int x){i=x;}private:    int i;};int main(void){    man a;    man &ra=a;  //引用定义的时候就要初始化【引用就像常量,只能初始化,不能赋值】    ra.set(123);    cout<<ra.get();    return 0;}参数的别名:#include<iostream>using namespace std;void swap1(int &a, int &b)  //利用别名交换交换两个数{    int temp;    temp=a;    a=b;    b=temp;}int main(void){    int  a =1;    int b=2;    swap1(a,b);    cout<<a  << b;    return 0;}