我正在创建一个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
看起来像一个一维数组类型为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] */
};
是,它将被存储在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]);
}
希望能有所帮助