指针和引用

来源:互联网 发布:你还在我身旁 知乎 编辑:程序博客网 时间:2024/05/16 08:37

1.指针和引用的差别
(1)非空区别:任何情况下都不能使用指向空值的引用。一个引用总是指向某些对象。如果声明一个变量并让它指向一个对象,但是该变量某些时候可能也不指向任何对象,这时应该把变量声明为指针,这样可以赋空值。引用不允许指向空值。
(2)合法性区别:使用引用之前不需要测试它的合法性,相反,指针应该总是被测试,防止其为空
(3)可修改区别:指针可以被重新赋值以及指向另一个不同的对象,但是引用则总是指向在初始化时被指定的对象,以后不能改变,但是指定的对象其内容可以改变
(4)应用区别:总的来说,以下情况下应该使用指针,考虑到存在不指向任何对象的可能,需要在不同的时刻指向不同的对象。如果总是指向一个对象,并且在指向一个对象后不会改变指向,应该使用引用。
2.

int &reiv;//错误,声明一个引用,但引用不能为空,必须同时初始化int &reiv2=iv;//声明了一个引用,并同时初始化,也就是reiv2是iv的别名int *pi;//正确,声明了一个指针,但是没有定义指针所指向的地址*pi=5;//错误,整数指针pi没有指向实际地址,在这种情况下给它赋值是错误的pi=&iv3;//正确,指针指向iv3的实际地址const double di;//错误,const常量赋值时,必须同时初始化const double maxWage=10.0;//const常量赋值并同时初始化const double *pc=&maxWage;//const常量指针赋值并同时初始化

3.传递动态内存

#include <iostream>using namespace std;viod swap1(int p,int q){int temp; temp=p;p=q;q=temp; //局部变量发生改变,但是实参没有改变}void swap2(int *p,int *q) //传进去地址,形参指向实参的地址{int *temp;//不分配内存*temp=*p; //创建了一个指针,并拷贝*p所指向内存的值到*temp所指向内存。系统在拷贝时临时给了一个随机地址,让他存值,函数结束后不收回,造成内存泄露*p=*q;*q=*temp;//不一定能成功交换两个数的值}void swap3(int *p,int *q){int *temp;temp=p;//指向而不是拷贝p=q;q=temp;//结束后指针的指向交换,对地址的值没有改变,不能实现交换}void swap4(int *p,int *q){int temp;temp=*p;*p=*q;*q=temp; //可以交换,修改的是指针所指向地址中的值}void swap5(int &p,int &q){int temp;temp=p;p=q;q=temp;//引用传递,修改的结果直接影响实参}int main(){int a=1,b=2;swap1(a,b);swap2(&a,&b);swap3(&a,&b);swap4(&a,&b);swap5(a,b);cout<<a<<" "<<b<<endl;}

4.

#include <iostream>void GetMemory(char *p,int num){p=(char *)malloc(sizeof(char) *num);};int main(){char *str=NULL;GetMemory(str,100);strcpy(str,"hello");return 0;}

p只是str的一个副本,p申请新的内存,只是把p所指的内存地址改变了,但是str没有任何影响。每执行一次GetMemory就会申请一块内存,但申请的内存不能有效的释放,结果是内存一直bei独占,最终造成内存泄露。

//用指针参数去申请内存void GetMemory(char **p,int num){*p=(char *)malloc(sizeof(char)*num);};int main(){char *str=NULL;GetMemory(&str,100);strcpy(str,"hello");cout<<*str<<endl;//输出h,字符串中某一个字符的值,默认是首字符cout<<str<<endl;//输出hellocout<<&str<<endl;//输出str的地址值}
//利用函数的返回值来传递动态内存#include <iostream>using namespace std;char *GetMemory(char *p,int num) //函数返回指针{p=(char *)malloc(sizeof(char)*num);return p;}int main(){char *str=NULL;str=GetMemory(str,100);strcpy(str,"hello");return 0;}

5.整型变量传值

void GetMemory2(int *z){*z=5;};int main(){int v;GetMemory2(&v);cout<<v<<endl;return 0;}

把v的地址传递给指针z,修改指针z指向地址的值,所以v的值也会发生改变。

0 0
原创粉丝点击