php运算符箭头,C语言点运算符和箭头运算符

二元运算符 . 和 -> 常常被称为点运算符(dot operator)和箭头运算符(arrow operator),借助于这两个运算符,可以选择结构或联合中的成员。

例 1 展示了点运算符的左操作数必须是一个结构或者一个联合,而右操作数必须是该类型(结构或联合)成员的名字。

【例1】

struct Article { long number; // 物品编号

char name[32]; // 物品名字

long price; // 物品单价(精确到美分)

/* ... */

};

struct Article sw = { 102030L, "Heroes", 5995L };

sw.price = 4995L; // 将价格改为49.95

点运算结果的类型,与所选择成员的类型是一样的。如果左操作数是一个左值,那么该运算也会产生左值。如果左操作数的类型有限定符(例如被声明为 const),那么结果类型也有该限定符。

点运算符的左操作数并非一定是左值,如下例所示:

struct Article getArticle(); // 函数原型

printf( "name: %s\n", getArticle().name );

函数 getArticle()返回一个 struct Article 类型的对象。按此结果,getArticle().name 是一个有效的表达式,但不是一个左值,因为函数的返回值不是一个左值。

运算符 -> 也可用于选择结构或联合的成员,但是箭头运算符的左操作数必须是一个指针,它指向一个结构或联合类型。右操作数是该结构或联合成员的名字。例 2 展示了运算符->的用法,同样使用例 1 所定义的结构 Article。

【例2】

struct Article *pArticle = &sw, // 一个指向struct Article的指针

const *pcArticle = &sw; // 一个指向struct Article的只读指针

++(pArticle->number); // 增加编号

if ( pcArticle->number == 102031L ) // 正确:获取只读指针

pcArticle->price += 50; // 错误:不能使用限定符const的指针来修改对象

箭头运算符的结果总是一个左值。它具有被选取成员的类型,也同样包括了其指针操作数的任何类型限定符。在例 2 中,pcArticle 是一个指向 const struct Article 的指针。其结果是,表达式 pcArticle->price 是一个常量。

包含箭头运算符的任何表达式,都可以利用点运算符进行重写,做法是先将指针解参考,然后使用点运算符:表达式 p->m 等效于(*p).m;相反地,如果 x 是左值的话,表达式 x.m 等效于(&x)->m。

和运算符 [] 一样,点运算符 . 和箭头运算符 -> 都具有最高的优先级,并且组合方式都是从左到右。因此,表达式 ++p->m 等同于 ++(p->m),表达式 p->m++ 等同于(p->m)++。

然而,表达式(*p).m 中的括号是有必要的,因为复引用运算符 * 的优先级比较低。表达式 *p.m 等效于 *(p.m),这种等效仅当在成员 m 是指针时才有意义。

我们通过结合下标运算符、点运算符和箭头运算符,对一个元素为结构的数组进行操作,来总结本文讲述的问题:

struct Article arrArticle[10]; // 一个具有10个元素的数组

// 每个元素为结构类型

arrArticle[2].price = 990L; // 设置数组元素arrArticle[2]的成员price

arrArticle->number = 10100L; // 设置数组元素arrArticle[0]的成员number

一个数组名称,例如本例中的 arrArticle,是一个指向第一个数组元素的常量指针。所以 arrArticle->number 指向第一个数组元素的成员 number。简单地说,对于任一的索引值 i,下面 3 个表达式是等价的:

arrArticle[i].number

(arrArticle+i)->number

(*(arrArticle+i)).number

它们都指向数组中索引值为 i 的元素的成员 number。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值