您的位置:首页 > 编程语言 > C语言/C++

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

2014-05-21 14:28 190 查看

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:将迷途指针改为空指针。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息