c,c++易错点之指针与引用

1、指针与引用的区别

(1)非空区别
在任何情况下都不能使用引用指向空值引用必须指向某些对象
如:int &reiv ;就是错误的,因为声明了一个引用,但是引用为空,没有进行初始化,所以出错,应改为: int iv ; int &reiv = iv;
(2)  合法性区别,指针使用前需要检测其合法性
(3)  可修改区别,指针可以重赋值 ,引用在初始化之后就不能够在改变
(4) 应用区别,
使用指针的情况:一是存在不指向任何对象的可能,二是在不同时刻需要指向不同对象

2、this指针的特点 

(1) this指针只能在成员函数中使用,全局函数,静态函数都不能使用this指针,实际上,成员函数默认第一个参数是 T*const this;
如:class A{public :int func(int p){}};  其中func的原型在编译器看来是:int  func(A const * this,int p);
(2) this指针在成员函数的开始前构造,在成员函数结束后消除


3、动态内存问题

3.1
#include<iostream>
using namespace std;
char *GetMemory(void){
    char p[] = "hello world";
    return p;
}
int main(){
    char *str ;
    str = GetMemory();
    cout<<str;
    return 0;
}
上面的结果可能是乱码也可能是正常输出,单不是“hello world”。因为GetMemory返回的是指向“栈内存”的指针,该指针的地址不是NULL,但其原来的内容已经被清除,新内容不可知。
如果将上面代码改为
#include<iostream>
using namespace std;
char *GetMemory(void){

    char *pp = "hello world";
    cout<<&pp<<endl;
    return pp;
}
int main(){
    char *str ;
    str = GetMemory();
    cout<<&str<<endl;
    cout<<str;
    return 0;
}
此时输出的结果为“hello world”。

4、通过引用或者指针修改原来的值

#include<iostream>
using namespace std;
void   change(int *a ,int &b ,int c){
    c = 1;
    b = 3;
    *a = 2;
}
int main(){
    int a = 1,b = 2 ,c = 3 ;
    change(&a,b,c);
    cout<<a<<b<<c;
    return 0;
}
输出的结果是:2,3,3

5、迷途指针

迷途指针也叫悬浮指针、失控指针,是对一个指针进行delete操作后,这样会释放他所指向的内存,但并没有把它设置为空时产生的。而后,如果你没有重新赋值(即从新给一个地址)就试图再次使用该指针,引起的结果是不可预测的。通常我们使用将 p = 0:将迷途指针改为空指针。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值