1

将数组简化为指针的 K&R 方法:(摘自C 中的数组和指针

K&R 试图创建一个数组和指针的统一处理,一种在编译器代码中公开而不是隐藏数组方程的处理。他们找到了一个优雅的解决方案,尽管有点复杂。“丑陋”的数组方程在其公式中被四个规则所取代:

1) An array of dimension N is a 1D array with
   elements that are arrays of dimension N-1.

2) Pointer addition is defined by:

      ptr # n = ptr + n * size(type-pointed-into)

   "#" denotes here pointer addition to avoid 
   confusion with ordinary addition.
   The function "size()" returns object's sizes.

3) The famous "decay convention": an array is 
   treated as a pointer that points to the 
   first element of the array.

   The decay convention shouldn't be applied
   more than once to the same object.

4) Taking a subscript with value i is equivalent 
   to the operation: "pointer-add i and then 
   type-dereference the sum", i.e.

      xxx[i] = *(xxx # i)


    When rule #4 + rule #3 are applied recursively 
    (this is the case of a multi-dimensional array), 
    only the data type is dereferenced and not the 
    pointer's value, except on the last step.

我不明白这是什么意思

  • 衰减约定不应多次应用于同一对象(在规则 #3 中)。
  • 当递归应用规则#4 + 规则#3 时(这是多维数组的情况),只有数据类型被取消引用,而不是指针的值,除了最后一步。

有人可以用例子来解释吗?

4

2 回答 2

1

尝试研究这段代码

#include <stdio.h>

int main() {

  int a[] = {42, 1, 5, 89, 7};
  int step = 3;

  int b = a[step];        // step 1
  printf("%d\n", b);

  b = *(a + step);        // step 2
  printf("%d\n", b);

  b = *(step + a);        // step 3
  printf("%d\n", b);

  b = step[a];            // step 4
  printf("%d\n", b);

  return (0);
}

这是可能的,因为:

  • 数组被授予为包含相同类型的变量/槽的连续内存块
  • []运算符和指针取消引用你应用相同的算术,相同的指针算术
    • 这是关键点,指针和数组不是一回事,在这种情况下,当您可以将数组视为指针或带有[]运算符的数组时,相同的算法适用于指针和数组,但指针和数组是 2不同的结构,2个不同的东西。

编辑:

我添加了第 4 步,只是为了阐明指针别名和[]运算符之间的相似性。

于 2013-08-04T12:54:38.183 回答
1

从您在问题中提供的链接中,考虑以下示例:

int mat[i][j]
mat[i][j] = *(*(mat + i * sizeof(row)) # j)
  • 当递归应用规则 #4 + 规则 #3 时(这是多维数组的情况),只有数据类型被取消引用,而不是指针的值,除了最后一步。这意味着*(mat + i * sizeof(row))取消引用一个聚合,在我们的例子中是“一个带有 j 个元素的整数数组”。只有第二个取消引用操作才能*(*(mat + i * sizeof(row)) # j)为您提供实际的int.
  • 上述情况成立,因为衰减只发生一次,即。*(mat + i * sizeof(row))是一个指针,它指向一个 int 数组”。
于 2013-08-04T13:00:04.737 回答