引用和指针

指针和引用

概念上区别


指针的定义格式如下:

<类型>*<指针名>[=<初始值>];

<类型>指出指针类型,<指针名>同标识符,*用来表示他后边的标识符是指针名。

**指针在定义时可以初始化,也可以不初始化。

int a=5;
int *pa=&a;
//pa是一个int型变量a的指针


以下为一些常用的不同类型的指针的定义格式:

double *p;     //p是一个double型变量的指针
char *pc;      //pc是一个char型变量的指针
float *pf;      //pf是一个float型变量的指针
int (*pa)[3];  //pa是一个指向一位数组的指针,该数组是具有3个元素的int型数组
int (*pfu)();   //pfu是一个指向函数的指针,该函数是一个无参数的int型函数
int **pp;       //pp是一个指向一级指针的指针,为二级指针

引用的创建格式如下:

<类型>&<引用名>=<变量名/对象名>;

   <>同标识符,&是修饰符,用来说明他后边的标识符是引用名。
    **在创建引用时一定要对引用进行初始化

例如:
int a=5;
    int &refa=a;
其中,ra是一个引用名,ra是变量a的别名,即将ra绑定在变量a上,ra和a都是int型的,
**类型相同很重要,引用和被引用的变量必须类型相同

引用的一些特性:

*引用被绑定在创建时对它初始化的变量上,引用时该变量的别名。
*引用本身不占用内存空间,不是一个变量。但是,引用具有值,也具有地址值。
*引用值的改变影响到被绑定的变量值,反之也一样

指针和引用各自作为函数参数和返回值

1.指针作为函数参数;

指针作函数参数实现传址调用,实参用地址值,形参用指针,具有较高的传递效率。

在被调用函数中可以通过指针来改变调用函数的实参值。

例如:

#include<iostream>
using namespace std;

void fun(int a,int *p)
{
	a*=a;//a*a=25
	*p/=*p;//*p/*p=1
	cout<<a<<","<<*p<<endl;
}
int main()
{
	int x=5;
	int y=9;
	cout<<x<<","<<y<<endl;
	fun(x,&y);
	cout<<x<<","<<y<<endl;
	system("pause");
return 0;
}</span>

运行该程序后,输出以下结果:


2.指针作为函数的返回值:

指针作为函数的返回值,该函数被称为指针函数;

例如:

#include<iostream>
#include<cstring>
using namespace std;

char *max(char s[],int n)
{
	char max=s[0];
	char *p=s;
	int i=0;
	for(i=0;i<n;i++)
	{
	max=s[i];
	p=s+i;
	}
	return p;
}


int main()
{
	char str[]="This is a string";
	char *pc=max(str,strlen(str));
	cout<<*pc<<endl;
	system("pause");
	return 0;
}
程序运行结果如下:

1.引用作为函数参数;

引用作为函数参数称为引用调用,它具有与传址调用相同的特点,
一是效率高,不拷贝副本,只传递地址值
二是可以在被调用函数中改变调用函数的实参值,因为形参是实参的引用。

例如:

#include<iostream>
using namespace std;

void fun(int a,int &refa)
{
	a*=a;//a*a=25
	refa/=refa;
	cout<<a<<","<<refa<<endl;
}
int main()
{
	int x=5;
	int y=9;
	cout<<x<<","<<y<<endl;
	fun(x,y);
	cout<<x<<","<<y<<endl;
	system("pause");
return 0;
}


2引用作为函数的返回值

引用做函数的类型时,该函数返回的是某个变量或对象的引用,而不是数据值。因此,要求返回语句return后边要用
变量名,返回的是该变量的引用。由于返回的是引用,而不是值,可以对它进行变量的操作。函数返回引用时不产生
副本,将它直接传递给接收返回值的变量或对象,注意被引用的变量必须是长寿命的,即外部或静态的。

例如:

#include<iostream>
using namespace std;

int &fun(int a)
{
static int t;
t=2*a;
return t;
}
int main()
{
	int x=5;
	int y=8;
	int ret1=fun(x);
	int ret2=fun(y);
	cout<<ret1<<","<<ret2<<endl;
	system("pause");
return 0;
}</span>
运行结果:


 结论:
1.不要返回一个临时变量的引用。
2.如果返回对象出了当前函数的作用域依旧存在,则最好使用引用返回,因为这样更高效。
引用和指针的区别和联系(注意笔试的时候非常喜欢考这个知识点)
1.引用只能在定义时初始化一次,之后不能改变指向其它变量(从一而终);指针变量的值可变。
2.引用必须指向有效的变量,指针可以为空。
3.sizeof指针对象和引用对象的意义不一样。sizeof引用得到的是所指向的变量的大小,而sizeof指针是对象地址的大小。
4.指针和引用自增(++)自减(--)意义不一样。
5.相对而言,引用比指针更安全。
总结一下:
指针比引用更灵活,但是也更危险。使用指针时一定要注意检查指针是否为空。指针所指的地址释放以后最好置0,否则可能存在野指针
问题。 

未完待续!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值