Chinaunix首页 | 论坛 | 博客
  • 博客访问: 8018199
  • 博文数量: 159
  • 博客积分: 10424
  • 博客等级: 少将
  • 技术积分: 14615
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-14 12:45
个人简介

啦啦啦~~~

文章分类
文章存档

2015年(5)

2014年(1)

2013年(5)

2012年(10)

2011年(116)

2010年(22)

分类: C/C++

2011-10-09 23:06:19

本文的copyleft归gfree.wind@gmail.com所有,使用GPL发布,可以自由拷贝,转载。但转载请保持文档的完整性,注明原作者及原链接,严禁用于任何商业用途。
作者:gfree.wind@gmail.com
博客:linuxfocus.blog.chinaunix.net

今天的笔记没有一个很好的标题,也很短。主要是针对&与[]操作符
A postfix expression followed by an expression in square brackets [] is a subscripted
designation of an element of an array object. The definition of the subscript operator []
is that E1[E2] is identical to (*((E1)+(E2))). Because of the conversion rules that
apply to the binary + operator, if E1 is an array object (equivalently, a pointer to the
initial element of an array object) and E2 is an integer, E1[E2] designates the E2-th
element of E1 (counting from zero).
也就是说对于数组array[10],实际上其等同于*((array)+(10)),也就等于10[array]。

The unary & operator yields the address of its operand. If the operand has type "type", the result has type "pointer to type". If the operand is the result of a unary * operator, neither that operator nor the & operator is evaluated and the result is as if both were omitted, except that the constraint on the operators still apply and the result is not an lvalue. Similarly, if the operand is the result of a [] operator, neither the & operator nor the unary * that is implied by the [] is evalued and the result is as if & operator were removed and the [] operator were changed to a + operator. Otherwise, the result is a pointer to the object or function designated by its operand.
也就说在*&NULL完全是合法的。

请看测试程序:
  1. #include <stdlib.h>
  2. #include <stdio.h>

  3. int main()
  4. {
  5.     int *p = NULL;
  6.     int array[10] = {1,2,3,4,5,6,7,8,9,0};

  7.     printf("p is %p and value is %d\n", &*p, 2[array]);

  8.     return 0;
  9. }
输出:
  1. p is (nil) and value is 3

阅读(3987) | 评论(3) | 转发(3) |
给主人留下些什么吧!~~

GFree_Wind2011-10-11 18:01:44

haotianmai: expert c中有句原话:
B simplified BCPL by omitting some features (such as nested procedures and some loop-ing constructs) and carried forward the ide.....
我明白。实际上对于汇编代码array[n]与*(array+n),没有区别

haotianmai2011-10-11 15:32:46

expert c中有句原话:
B simplified BCPL by omitting some features (such as nested procedures and some loop-ing constructs) and carried forward the idea that array references should "decompose" into pointer-plus-offset references.
后半句话是说array references应该转换成pointer-plus-offset references

haotianmai2011-10-11 14:37:45

E1[E2]其实编译器是按*(E1+E2)处理的。
汇编寻址方式是 (Eb,Ei,s), E1[E2]对应的地址是(E1 + sizeof(E1[0]) * E2  )