C中的多维数组如何工作

时间:2015-07-08 08:08:46

标签: c multidimensional-array

我正在使用多维数组创建一个包含表格的C程序,用于存储两个字母和一个数字,如下所示:

int main()
{
    char x[5][3];
    int y[5];

    for (i=0; i<5; i++)
    {
        printf('Enter the 2 characters for x');
        scanf('%s', x[i]);

        printf('Enter number for y');
        scanf('%d', &y[i]);
    }
}

我在这里不明白的是for循环。例如,对于迭代i=0,如果用户输入两个字符AB这些字母存储在x的内存位置?我的意思是它位于x[0][0]x[0][1]或其他位置?

我知道这可能是一个愚蠢的问题,但我真的很困惑。 感谢您的帮助。

5 个答案:

答案 0 :(得分:4)

C中的多维数组是一维数组元素又是数组。

例如,如果您有一个定义为

的数组
char x[5][3];

您可以通过以下方式重写其定义

typedef char T[3];
T x[5];

所以现在数组x看起来像一个类型T的一维数组,其中T又有类型char[3]

考虑到这一点,在程序循环中使用数组x和数组y之间没有区别。

for ( i = 0; i < 5; i++ )
{
    printf('Enter the 2 characters for x');
    scanf('%s', x[i]);

    printf('Enter number for y');
    scanf('%d', &y[i]);
}

两个数组都有5个元素。数组x的元素具有类型char[3]和数组y的元素的唯一区别是类型int

因为格式说明符%s用于在字符数组中输入字符串,并且数组x的每个元素确实是类型char[3]的字符数组,所以每次循环迭代时每个数组x[i]都有自己的字符串。 例如,在向数组输入值之后,它可能看起来像是按照以下方式定义的

char x[5][3] =
{
   { "AB" }, /* x[0] */
   { "CD" }, /* x[1] */
   { "EF" }, /* x[2] */
   { "GH" }, /* x[3] */
   { "IJ" }  /* x[4] */
};

答案 1 :(得分:1)

是的,它将存储在x [0] [0]和x [0] [1]位置。

虽然scanf字符串,但我们需要在代码中提供character Array's内存位置的起始地址为x[i]

答案 2 :(得分:1)

在您的示例中,它们将分别存储在x[0][0]x[1][0]。 此外,您可能希望将scanf('%s', x[i]);更改为scanf('%c', x[i]);,因为您只使用了一个字符。

答案 3 :(得分:0)

这是一个指针所以,如果用户输入字符串“AB”,将在内存中分配“AB”,你的数组的第一个案例将指向分配给它的第一个案例string:

... | 45 | 46 | 47 | 48 | ...
    ---------------------
    |  x |  A | B  |  x |
例如,

x [0] [0]将指向案例46。

答案 4 :(得分:-1)

问题在于,你有一个二维char数组,这意味着在一个内存位置你不能存储多个单个字符。因此它将存储在0和1位置。但是我认为你的方法不正确。

在您的情况下,您要么存储char *,以便您的数组类似于:

char* tab[5] ;

您需要为每行分配内存:

tab[i] = (char *) malloc ( 2 * sizeof(char));

或者你可以保留你的阵列而不是(如果你想确定内存中发生了什么):

for (i=0; i<5; i++)
{
    printf("Enter the first character for x");
    scanf("%c", &x[i][0]);
    printf('Enter the second character for x');
    scanf("%c", &x[i][1]);
}

希望这有帮助