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:将迷途指针改为空指针。