c - 旋转多维指针

标签 c pointers

如果我有一个像这样的网格的多维指针表示

char **p;
int w; // width (i.e. number of columns)
int h; // height (i.e. number of rows)

如何为 NxM 网格创建顺时针旋转 90 度的副本?

我试过将高度分配为新宽度,将宽度分配为新高度,然后转置这些值。然后我打算通过反转行的值来完成,但我没有设法做到这一点。

最佳答案

实际的转置是相当痛苦的:您必须将每个元素从“现在的位置”移动到“它应该在转置中的位置”。如果您确实有一个指针 p 指向第一个 M 指针,并且每个 M 指针都指向第一个 N chars(用作大小为 M 的数组,大小为 N 的数组 chars):

       +---+       +---+---+---+---+
p ---> | * | ----> | a | b | c | d |
       +---+       +---+---+---+---+
       | * | --
       +---+   \          +---+---+---+---+
       | * | -----------> | i | j | k | l |
       +---+     \        +---+---+---+---+
                  \
                   \    +---+---+---+---+
                    --> | e | f | g | h |
                        +---+---+---+---+

然后你需要一个新的指针(我将其称为 q)指向 N 个指针中的第一个,每个指针指向 M 个 char 中的第一个(注意:这与您要求的换位不同):

       +---+        +---+---+---+
q ---> | * | -----> | a | e | i |
       +---+        +---+---+---+
       | * | --
       +---+   \
       | * |etc \     +---+---+---+
       +---+     ---> | b | f | j |
       | * |etc       +---+---+---+
       +---+

但是,如果您可以忍受相对烦人的下标编写和任何缓存未命中对运行时的影响,您可以简单地访问 p[i][j] 作为 p[j] [i]p[N-1-j][i] 等,以“假装”事物被转置。这对于一些宏来说可能是最简单的:

#define ORIENTATION_A(p, M, N, i, j)  ((p)[i][j])
#define ORIENTATION_B(p, M, N, i, j)  ((p)[(N)-1-(j)][i])
/* etc */

(注意:以上均未测试)。

关于c - 旋转多维指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9972750/

相关文章:

c - 数组已填充最后一个元素

c++ - Anaconda 将 C/C++ 链接器与重复库混淆

c - 没有参数的格式说明符

c++ - 如何在OpenCV中单击鼠标以在图像上绘制矩形?

c++ - 在 C++ 文档教程的这个示例中,为什么指针声明了两次?

c - 理解指针

Python 名称/绑定(bind) - 为什么不是所有长度相同的列表都是 "same list"?

使用HFONT对象设置控件字体后是否可以直接删除?

c - 如何使用 C 将 SHA1 输出存储到文件

c - 如何用C语言中的一个函数来操作不同大小的矩阵?