假设我有一个由100个元素组成的一维数组。有没有一种方法可以把这个数组当作一个10x10的二维数组,这样我就可以对它进行多参数排序。我真的不想将原始数组的内容存储到新的多维数组中,我只想要一种方法来操作一维数组,就好像它是二维的一样。
发布于 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通过提供适当的比较函数来对元素进行排序。以下代码就是这样做的:
#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的调用--只是稍微乏味一点……
/* 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 "; 示例使用/输出
$ ./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阵列提供了一种方便方法,可以避免您自己提出寻址方案。
发布于 2018-02-16 06:31:47
关于这是否是严格合法的C11还存在一些争议,但像下面这样的代码是相当常见的:
#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替换为:
#define a2(x,y) a1[10*(x)+(y)]然后用a2(x,y)替换a2[x][y]。或者使用函数,但这会耗费您的函数调用开销(或者创建一个inline函数)。
https://stackoverflow.com/questions/48817180
复制相似问题