-2

我正在浏览一个问题并找到了这个答案。

答案最后我看不懂这个程序,特别是putoff函数的前三行

 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>

 #define NUM_ELEM(ar) (sizeof(ar) / sizeof((ar)[0]))

int * put_off(const int newrow[2])
{
static int mymatrix[3][2];
static int (*rowp)[2] = mymatrix;
int (* const border)[] = mymatrix + NUM_ELEM(mymatrix);

memcpy(rowp, newrow, sizeof(*rowp));
rowp += 1;
if (rowp == border) {
    rowp = mymatrix;
}

return *rowp;
 }

int main(int argc, char *argv[])
{
int i = 0;
int row[2] = {0, 1};
int *rout;

for (i = 0; i < 6; i++) {
    row[0] = i;
    row[1] += i;
    rout = put_off(row);
    printf("%d (%p): [%d, %d]\n", i, (void *) rout, rout[0], rout[1]);
}

return 0;
  }

我需要一些关于程序中函数的前 3 行的帮助。

4

1 回答 1

1

这里有一些解释性说明可以帮助您:

static int mymatrix[3][2];

mymatrix是一个 3 行 2 列的二维整数数组。C 使用行优先顺序,这意味着行在内存中一个接一个地存储。static 关键字使其值在函数调用中保持不变(而作用域仍然是本地的)。

static int (*rowp)[2] = mymatrix;

这声明了一个指向两个整数数组的指针(即本例中的一行 mymatrix)。将其初始化为 mymatrix 相当于将其初始化为第一行。static 关键字当然和上面的意思一样。

int (* const border)[] = mymatrix + NUM_ELEM(mymatrix);

border是一个指向整数数组的常量指针(即指针不能更改)。它被初始化为 mymatrix 之外的内存地址(这可能有点不寻常)。具体来说,它指向如果mymatrix还有一行将存在的下一行,因此当行指针正好指向该点时,函数将行指针环绕回到填充整个矩阵的第一行。

对于指针、数组括号等的集合,您可以随时尝试cdecl看看它是否可以为您翻译。

于 2013-01-27T05:56:14.337 回答