ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 应用于变量名称时*和&的含义是什么?

2019-09-19 14:05:57  阅读:196  来源: 互联网

标签:c pointers reference c-faq


在C中,有什么区别:

 void func(MyType&); // declaration

 //...
 MyType * ptr;

 func(*ptr); // compiler doesnt give error

 func(ptr); // compiler gives error i thought & represents memory address so 
            // this statement should correct as ptr is only a pointer
            // or address of some real var.

解决方法:

一元前缀运算符&当应用于对象时,产生对象的地址:& obj.
当应用于即将声明的变量时,类型修饰符&将修改变量的类型为引用类型:int&.

这同样适用于*:当作为指针的一元前缀运算符应用时,它将取消引用指针,产生对象:* ptr.
当用作要声明的变量的类型修饰符时,*会将类型修改为指针:int *.

以类似的方式,应用于声明的变量的类型修饰符[]将变量的类型修改为数组,而应用于数组类型的对象的二进制中缀运算符[]将访问数组的子对象之一.

类型修饰符适用于声明的变量,而不是它们声明的类型.例如,这个

int *p, **pp, i, a[10], &r = i; 

定义一个int指针,一个指向int的指针,一个vanilla int,一个10 int的数组和一个int引用. (后者立即被初始化,因为你不能有一个未初始化的引用.)注意,类型修饰符在语法上属于它们正在修改它的类型的声明变量,而不是声明的变量的类型.然而,类型修饰符(*和&)修改变量的类型.
但是,在下面的例子中,p,i和a假定为已经声明的变量

*pp = &i;
a[0] = i;

*和&是一元前缀运算符,取消引用pp并产生i的地址,而[]产生数组a中的第一个int对象.

事实上,C和C并不关心类型修饰符周围的空白,并且当它放置它们时导致不同的阵营并不能让事情变得更容易.
有些人将类型修饰符放在类型附近.他们争辩说它会修改类型,所以应该去那里:

int* ptr;

缺点是在声明多个对象时会变得混乱.这个

int* a, b;

将a定义为指向int的指针,但将b指定为int.这就是为什么有些人喜欢写作

int *ptr;
int *a, *b;

我建议不要在同一个语句中声明多个对象. IMO使代码更容易阅读.此外,它可以让你自由选择任何一个约定.

更复杂的是,除了类型修饰符和一元前缀运算符&和*,还有二进制中缀运算符&和*,表示“按位AND”和“乘法”.并且为了增加对伤害的侮辱,在C中你可以为这些操作符(和二进制中缀[])提供一元前缀和二进制中缀变体,用于用户定义的类型,并且对于它们的语义完全免费.

标签:c,pointers,reference,c-faq
来源: https://codeday.me/bug/20190919/1813176.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有