指针和引用

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;//输出hello
cout<<&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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值