代码之家  ›  专栏  ›  技术社区  ›  daya

不明白为什么这四个符号是一样的?[副本]

c
  •  1
  • daya  · 技术社区  · 9 年前

    数组声明:

    int arr [ ]={34, 65, 23, 75, 76, 33}; 
    

    四种符号:(考虑i=0)

    arr[i]
    

    *(arr+i)
    

    *(i+arr)
    

    i[arr]
    
    6 回复  |  直到 9 年前
        1
  •  6
  •   Some programmer dude    9 年前

    让我们看看阵列在内存中的布局:

    low address                   high address
    |                             |
    v                             v
    +----+----+----+----+----+----+
    | 34 | 65 | 23 | 75 | 76 | 33 |
    +----+----+----+----+----+----+
    ^    ^    ^    ^
    |    |    |    ...etc
    |    |    |
    |    |    arr[2]
    |    |
    |    arr[1]
    |
    arr[0]
    

    arr[0] ,第二个 arr[1] arr[i] *(arr + i) .

    *(arr+i) does是首先获取指向第一个元素的指针,然后执行指针算术以获取指向索引处所需元素的指针 i ,然后解引用指针以获取其值。

    commutative 加法的性质,表达式 等于 *(i + arr) i[arr] .


    的等价性 也是 衰退 数组的一个指针指向它的第一个元素。

    指向数组第一个元素的指针是 &arr[0] arr[0] 应等于 *(arr + 0) &arr[0] 必须等于 &*(arr + 0) 。将零添加到任何内容都是不可操作的,因此导致表达式 &*(arr) 。只有一项且没有运算符的括号也可以删除,留下 &*arr arr &arr[0] 等于

        2
  •  3
  •   VIX    9 年前

    数组中的每个元素在内存中都有一个位置。阵列中的位置是连续的。C中的数组是指针,总是指向集合(数组的第一个元素)内存中的第一个方向。

    arr[i] = *(arr + i)

    *(arr+i) =>通过在内存中添加该点的位置来获取内存中的值 arr i value

    *(i+arr) =>是一样的吗 *(arr+i)

    i[arr] *(i+arr) .这是另一种表达方式。

        3
  •  1
  •   Basile Starynkevitch    9 年前
        4
  •  1
  •   alinsoar    9 年前

    a[i] 是语法糖 *(a+i) .

    另一方面 *(a+i)=*(i+a)=i[a] arithmetic of pointers is commutative .

        5
  •  0
  •   dbush    9 年前

    由于数组下标运算符 [] 定义。

    第6.5.2.1节 C standard

    2. [] 这个 是吗 E1[E2] 是 与相同 (*((E1)+(E2))) + 操作员,如果 E1 是数组对象 (相当于指向数组对象初始元素的指针) E2 是整数, E1[E2] 指定 E2 -的第th个元素 (从零开始计数)。

    表达式 arr[i] 在你的例子中是这样的 因为标准规定这与 *(E1+E2) 这意味着 arr[i] 与相同 *(arr + i)

    *(arr+i) *(i + arr) .将上述等价规则应用于该表达式得出 i[arr] .

        6
  •  0
  •   Sanjeev    7 年前

    这是因为C语言中的数组变量(即示例中的arr)只是指向内存位置数组开头的指针。指针是表示特定内存位置地址的数字。当你把和放在指针前面时,它意味着“给我该内存位置中的数据”。

    • 因此,如果arr是指向数组开头的指针,*(arr)或*(arr+0)是 和*(arr+1)是 等等
    • 一个看起来像 A[B] *(A+B) 所以 arr[0]=*(arr+0)
    • 因为 A+B=B+A *(arr+i)=*(i+arr)
    • 因为 arr[i]=*(arr+i) *(arr+i)=*(i+arr) .