首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将一维数组视为用于排序的二维数组

将一维数组视为用于排序的二维数组
EN

Stack Overflow用户
提问于 2018-02-16 06:14:59
回答 2查看 180关注 0票数 2

假设我有一个由100个元素组成的一维数组。有没有一种方法可以把这个数组当作一个10x10的二维数组,这样我就可以对它进行多参数排序。我真的不想将原始数组的内容存储到新的多维数组中,我只想要一种方法来操作一维数组,就好像它是二维的一样。

EN

回答 2

Stack Overflow用户

发布于 2018-02-16 11:19:18

嗯,是的,你可以,但这不是一般推荐的。无论您使用的是一维阵列还是二维阵列,您只需使用X数量的存储即可。你可以随心所欲地使用那块内存。当需要在该块中存储“数组的数组”时,您可以通过将块声明为2D数组来获得便利,但没有强制要求您必须这样做。

例如,以您的100个元素为例,如果您的一维数组包含100个元素,并且您希望在数组中存储10个元素,那么您将只需手动索引提供倍数10 * sizeof(type)的子数组,这正是指针算法为您做的事情。实际上,您将在一维数组中寻址,就好像您声明了一个指向total/n元素数组的指针,然后为其中的n元素分配了指针。(例如,如果您要将100个字符的存储划分为10个字符串,则为char (*s)[10]; )

以一个100个字符的数组为例,您希望使用它来存储和排序10-10个字符字符串(9-char +nul结尾字符)。您可以简单地声明char s[100] = "";,然后将字符串存储在s + n * 10的偏移量处。要对数组进行排序,您可以使用自己的排序,或者只使用qsort通过提供适当的比较函数来对元素进行排序。以下代码就是这样做的:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define NROW 10
#define NCOL NROW

/* qsort - string comparison */
int cmpstrings (const void *a, const void *b) {
    return strcmp ((char * )a, (char *)b);
}

int main (void) {

    char s[NROW * NCOL] = "";       /* 1D array 100 chars */

    strcpy (s, "my");               /* fill with 10 strings */
    strcpy (s + NROW, "dog");
    strcpy (s + NROW * 2, "has");
    strcpy (s + NROW * 3, "fleas");
    strcpy (s + NROW * 4, "but");
    strcpy (s + NROW * 5, "the");
    strcpy (s + NROW * 6, "cat");
    strcpy (s + NROW * 7, "doesn't");
    strcpy (s + NROW * 8, "have");
    strcpy (s + NROW * 9, "any");

    printf ("unsorted:\n");
    for (int i = 0; i < NROW; i++)
        printf ("  s[%2d] : %s\n", i, &s[i*NCOL]);

    qsort (s, NCOL, NROW, cmpstrings);  /* qsort strings */

    printf ("\nsorted:\n");
    for (int i = 0; i < NROW; i++)
        printf ("  s[%2d] : %s\n", i, &s[i*NCOL]);

}

(注意:使用 strcpy只是为了方便加载数组中的单个字符串。您可以使用在初始化器中指定的100个字符轻松地初始化数组)

例如,您可以使用下面的初始化器并完全消除对strcpy的调用--只是稍微乏味一点……

代码语言:javascript
复制
    /* initialize 100-char array with 10 sub-arrays of strings */
    char s[] = "my\0       dog\0      has\0      fleas\0    but\0      "
               "the\0      cat\0      doesn't\0  have\0     any\0      "; 

示例使用/输出

代码语言:javascript
复制
$ ./bin/array1dstrings
unsorted:
  s[ 0] : my
  s[ 1] : dog
  s[ 2] : has
  s[ 3] : fleas
  s[ 4] : but
  s[ 5] : the
  s[ 6] : cat
  s[ 7] : doesn't
  s[ 8] : have
  s[ 9] : any

sorted:
  s[ 0] : any
  s[ 1] : but
  s[ 2] : cat
  s[ 3] : doesn't
  s[ 4] : dog
  s[ 5] : fleas
  s[ 6] : has
  s[ 7] : have
  s[ 8] : my
  s[ 9] : the

只要您不试图访问有效内存块之外的内存,C就不会对您如何使用内存块施加任何限制。这取决于您是否使用能够实现这一点的寻址方案。2D阵列提供了一种方便方法,可以避免您自己提出寻址方案。

票数 0
EN

Stack Overflow用户

发布于 2018-02-16 06:31:47

关于这是否是严格合法的C11还存在一些争议,但像下面这样的代码是相当常见的:

代码语言:javascript
复制
#include <stdio.h> 

int a1[100]; 
int (*a2)[10] = (int (*)[10])a1; 

int main(int argc, char *argv[]) { 
        for (int i = 0; i < 100; i += 1) a1[i] = i + 1; 

        for (int i = 0; i < 10; i += 1) { 
                for (int j = 0; j < 10; j += 1) { 
                        printf("%2d ", a2[i][j]); 
                } 
                printf("\n"); 
        } 
} 

您可以使其严格遵守,但不太方便,方法是将a2替换为:

代码语言:javascript
复制
#define a2(x,y) a1[10*(x)+(y)]

然后用a2(x,y)替换a2[x][y]。或者使用函数,但这会耗费您的函数调用开销(或者创建一个inline函数)。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48817180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档