多维数组在C语言中是如何工作的



我正在创建一个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,如果用户输入两个字符A, B,这些字母存储在x的内存位置的哪里?我的意思是它是在x[0][0]x[0][1]位置还是其他位置?

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

C语言中的多维数组是一个一维数组,其元素依次为数组。

例如,如果你有一个数组定义为

char x[5][3];

你可以这样重写它的定义

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

现在数组x看起来像一个一维数组类型为TT类型为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] */
};

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

scanf是字符串时,我们需要给出character Array's内存位置的起始地址,该地址在代码中是x[i]

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

这是一个指针所以,如果用户输入字符串"AB", "AB"将被分配到内存中,你的数组的第一个大小写将指向为字符串分配的第一个大小写:

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

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

问题是这里有一个二维字符数组,这意味着在一个内存位置中不能存储多个字符。所以它会被存储在位置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]);
}

希望能有所帮助

相关内容

  • 没有找到相关文章

最新更新