gpt4 book ai didi

c - 指针和指向二维数组的指针

转载 作者:行者123 更新时间:2023-11-30 20:28:01 26 4
gpt4 key购买 nike

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

在答案的最后我无法理解这个程序,具体来说是 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 行的帮助。

最佳答案

以下是一些可以帮助您继续进行的说明:

static int mymatrix[3][2];

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

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

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

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

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

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

关于c - 指针和指向二维数组的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14544439/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com