C++指针和引用

  1. 指针里面存的是某个变量的地址。
  2. 变量的引用就是一个变量的别名,变量和变量的引用代表着同一个变量。
  3. 紧跟在类型后面的&符号就是引用的声明符号,其他情况都可以认为是取地址符号。
  4. 引用不是一种独立的数据类型,引用只有声明,没有定义。必须先定义一个变量,之后对该变量建立一个引用,即声明该引用代表哪一个变量。
  5. 指针可以先声明,之后的任意时刻指向某个变量的地址。
  6. 声明一个引用后,不能再让其作为另一个不同类型变量的引用了。
  7. 不能建立引用数组。
  8. 可以建立引用的引用(C++新标准支持),也可以建立引用的指针。
  9. 引用其实就是一个指针常量,他的指向不能改变,只能指向一个指定的变量。所以,引用的本质还是指针,所有引用的功能都可以由指针实现。(C++之所以增加引用的机制,是为了方便用户,用户可以不必具体去处理地址,而把引用作为变量的“别名”来理解和使用,而把地址的细节隐藏起来,这样难度会小一些。)
  10. 用new申请一个类对象的时候,对象申请成功之后会默认调用其构造函数,而C语言中的malloc只是会申请空间,但是不会调用对象的构造函数。

验证2,3:

  int a = 5; //语句1
    cout << "语句1:" << a << endl;
    int &b = a; //语句2
    int c = a; //语句2
    cout << "语句2:" << b << endl;
    cout << "语句2:" << &b << endl;
    cout << "语句2:" << c << endl;
    cout << "语句2:" << &c << endl;

输出

语句15
语句25
语句20x28fe84
语句25
语句20x28fe80

总结:

int &b = a; 
int c = a; 
&b和c输出的结果完全一致,即:变量和变量的引用代表着同一个变量

验证4,6,9:

    swap(a, c);
    cout << "swap:" << "a =  " << a << "c =  " << c << endl;
    swap(&a, &c);
    cout << "swap:" << "a =  " << a << "c =  " << c << endl;
    swap_(a, c);
    cout << "swap:" << "a =  " << a << "c =  " << c << endl;
void swap(int *pa, int *pb) {
    int t = *pa;
    *pa = *pb;
    *pb = t;
}

void swap_(int &a, int &b) {
    int t = a;
    a = b;
    b = t;
}

void swap(int a, int b) {
    int t = a;
    a = b;
    b = t;
}

输出

swap:a =  5c =  10
swap:a =  10c =  5
swap:a =  5c =  10

总结:

  1. 4,6在编辑器中会提示错误。
    2.根据输出结果,swap(a, c);无法调换a和c的值,而后面两个方法可以,这说明引用和指针意义相同,即证明9。
    swap(int &a, int &b)与swap(int a, int b)有重命名冲突,也说明&a与a其实都代表的变量,只是名称不同,即证明2。

验证:8,9

  Student maqi = {"maqi", 1125, man, 18};
    Student &newMaqi = maqi;
    newMaqi.name = "maqi_1";
    cout << newMaqi.name << "," << newMaqi.age << "," << newMaqi.num << "," << newMaqi.sex << endl;
    string &name = newMaqi.name;
    cout << "newMaqi:" << name << endl;
    cout << "newMaqi:" << &name << endl;
    cout << "=============================================="<< endl;
    Student newMaqi_ = maqi;
    newMaqi_.name = "maqi_2";
    cout << newMaqi_.name << "," << newMaqi_.age << "," << newMaqi_.num << "," << newMaqi_.sex
         << endl;
    string &name_ = newMaqi_.name;
    cout << "newMaqi_:" << name_ << endl;
    cout << "newMaqi_:" << &name_ << endl;
    cout << "newMaqi:" << name << endl;
    cout << "newMaqi:" << &name << endl;
    cout << "=============================================="<< endl;
    Student newMaqi__ = maqi;
    newMaqi__.name = "maqi__2";
    cout << newMaqi__.name << "," << newMaqi__.age << "," << newMaqi__.num << "," << newMaqi__.sex
         << endl;
    string &name__ = newMaqi__.name;
    cout << "newMaqi_:" << name_<< endl;
    cout << "newMaqi_:" << &name_ << endl;
    cout << "newMaqi__:" << name__ << endl;
    cout << "newMaqi__:" << &name__ << endl;
    cout << "newMaqi:" << name << endl;
    cout << "newMaqi:" << &name << endl;
    cout << "=============================================="<< endl;
    Student *pNewMaqi = &maqi;
    pNewMaqi->name = "maqi_3";
    string &name_p = pNewMaqi->name;
    cout << "pNewMaqi:" << name_p << endl;
    cout << "pNewMaqi:" << &name_p << endl;
    cout << "newMaqi:" << name << endl;
    cout << "newMaqi:" << &name << endl;

输出:

maqi_1,18,1125,1
newMaqi:maqi_1
newMaqi:0x28fe54
==============================================
maqi_2,18,1125,1
newMaqi_:maqi_2
newMaqi_:0x28fe30
newMaqi:maqi_1
newMaqi:0x28fe54
==============================================
maqi__2,18,1125,1
newMaqi_:maqi_2
newMaqi_:0x28fe2c
newMaqi__:maqi__2
newMaqi__:0x28fe08
newMaqi:maqi_1
newMaqi:0x28fe50
==============================================
pNewMaqi:maqi_3
pNewMaqi:0x28fe54
newMaqi:maqi_3
newMaqi:0x28fe54

总结:
1.查看输出结果可知newMaqi/newMaqi__都为maqi的引用,且newMaqi/newMaqi__对name的修改都不会影响到maqi,说明是另外开辟的内存复制了maqi,而pNewMaqi的修改则会直接影响到maqi的name.,说明指针是直接操作当前内存的。

验证 10

void newAndDel() {
    cout << "==============================================" << endl;
    Maqi *pMaqi = (Maqi *) (malloc(sizeof(Maqi))); //C语言中使用 malloc 来申请一个Maqi 类型变量的内存
    pMaqi->name = "malloc";
    cout << "pMaqi->name = "<<pMaqi->name << endl;
    free(pMaqi);
    cout << "==============================================" << endl;
    Maqi *pMaqi_ = new Maqi(); //C++ 中使用 new 来申请一个Maqi 类型变量的内存
    pMaqi_->name = "new Maqi()";
    cout << "pMaqi->name = "<<pMaqi_->name << endl;
//怎么样,看出 new 的优势了吧!
    delete pMaqi_; //删除变量
    cout << "==============================================" << endl;
    Maqi *p = new Maqi[5]; //使用new申请一个包含5个Maqi 元素的数组
    delete[] p; //删除数组
}

输出:

==============================================
pMaqi->name = malloc
==============================================
 Maqi()
pMaqi->name = new Maqi()
 ~Maqi()
==============================================
 Maqi()
 Maqi()
 Maqi()
 Maqi()
 Maqi()
 ~Maqi()
 ~Maqi()
 ~Maqi()
 ~Maqi()
 ~Maqi()

总结:
C++新增的new和delete明显比较方便,且调用了Maqi的构造和析构函数,这个和java就很像了,且malloc申请内存如果失败需要自行判断,比较麻烦。

参考:
https://www.cnblogs.com/codingmengmeng/p/5865510.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值