关于int *a; int &a; int & *a; int * &a
选择具有能效标识的产品,如A级或超A级 #生活知识# #节约生活# #节能装修#
上述的四条语句,前面两个很好理解,而后面两个,大部分C++初学者都会比较困惑,今天我也是查阅了一些资料以后才恍然大悟。下面具体来说明一下:
int i;
int *a = &i;//这里a是一个指针,它指向变量i
int &b = i;//这里b是一个引用,它是变量i的引用,引用是什么?它的本质是什么?下面会具体讲述
int * &c = a;//这里c是一个引用,它是指针a的引用
int & *d;//这里d是一个指针,它指向引用,但引用不是实体,所以这是错误的
先是第一个问题:引用的本质是什么?
引用就是指针,两者没有区别。我们可以把引用想象成一个不需要"*"就可以访问变量的指针,对比如下程序:(引用可以直接使用被引用的对象本身,不再需要指针的解引用就可以了,这样做的目的就是尽量少的使用指针)
void function(int *a)
{
*a = 100;
}
int main()
{
int x=200;
int *b = &x;
function(b);
return(0);
}
void function(int &a)
{
a = 100;
}
int main()
{
int x = 200;
function(x);
return(0);
}
以上两段程序完成的功能是一样的。
第二个问题:int * &a和int & *a
我在写这两句语句时,在int 和*(&)间空了一格,而后面的&(*)紧跟a。原因是:分析此类语句时,先看a前紧跟的是什么,它决定了a的类型。而int后的一个空格是为了防止int *a, b;//a是指针,而b不是。
其他:int * *a;
它的功能和int * &a一样,两者生成的二进制代码一样。这再一次说明了引用就是指针。
以上如果有什么错误或什么建议,忘高手们指出哈!呵呵
///
如果你说的是函数的形参,那么 void foo(int* ptr); 是传值调用,比如你这么调用 int a; int* pValue = &a; foo(pValue); 这样的情况下,pValue的值是不能被函数foo改变的,也就是pValue肯定是指向a的。 但是如果你这么声明 void foo(int*& ptr); 则是传递引用,那么如果你函数里面 void foo(int*& ptr) { ptr = NULL; } 这样调用过之后,pValue就变成了NULL。而第一种情况pValue是不能被改变的。 引用是C++带来的很重要一个特性,他在很多情况下避免了使用指针。而且,在C++里面,引用是不可以捏造的,比如C你可以很容易弄一个NULL的指针,而引用这不存在NULL引用。 上面的foo函数如果要用C来实现,则必须用指针的指针: void foo(int** pptr) { *ptr = NULL; } 调用的时候要foo(&pValue) 这种技术很多用在比如定义一个安全删除指针的函数,所谓安全就是,只有当指针为零的时候才执行删除,删除之后,立刻把指针赋值为NULL。 template<typename T> inline safe_delete(T*& ptr) { if (ptr) { delete ptr; ptr = NULL; } } 在C++里面,能不用指针都应该尽量避免,STL里面就大量使用引用。
网址:关于int *a; int &a; int & *a; int * &a https://www.yuejiaxmz.com/news/view/832155
相关内容
main() { int a=1,b=0; for( ; a有以下程序 int main() { int x,a=1,b=1; while(
以下程序运行后的输出结果是【】。 fun(int a){int b=0;stat
分数转化为整int,int a=2/3,是0; int c=7/5;是1;不存在四舍五入。
int a=3,b=2,c=1; if(a>b && b&
若有 int *p1,*p2,a[10]; p1=&a[1]; p2=&
下面程序段的执行结果是( )。 int a,b,c,t; a=1;b=2;c=2
若有语句int a[4][3],*p= &a[0][0],i,j ; ,
假设 int a=8,b=3,那么a%b的结果为1
已知int a=12,b=3,则表达式a=b+2的值是( )