指针和引用
概念上区别:
指针的定义格式如下:
<类型>*<指针名>[=<初始值>];
<类型>指出指针类型,<指针名>同标识符,*用来表示他后边的标识符是指针名。
**指针在定义时可以初始化,也可以不初始化。
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,否则可能存在野指针
问题。
未完待续!