关于C语言2维数组的问题

int x[3][2]={0},i;

for(i=0;i<3;i++) scanf("%d",x[i]);
这里的scanf中写的是"x[i]“,只写了1个维度,这是正确的,我调试过了,可是怎么理解呀?这是个2维数组呀,这里的x[i]是当做指针吗?如果是指针,指向哪里?还有,我把for循环的3改为6,为什么无法给第2维的3个变量赋值?这种写法貌似只能给第一维度赋值,为什么?望高手不吝赐教,不要复制、粘贴,请详细解答

是正确的。x[i]的值与x[i][0]的地址值是相同的,也就是说x[i]等同于&x[i][0]。
但严格上讲这是不同的两个东西,只是两种的值相同而已。x[i]是一个一维数组。类似于说
int s[2], *p=s;
中p和s是两个不同的东西,而且类似的p的值、s的地址值都和&s[0]相同。p=s与p=&s[0]没有两样。追问

你好,能不能详细解答一下?还有,如果是3维的也可以用类似的表达吗?比如 int x[3][4][5],那么scanf可否也采用这样的简写,正确的代码怎么写?

追答

没什么更详细的了。
数组名的值参与运算就是一个指向数组首元素的常量指针,除了运算符是sizeof。也就是说,对于int s[3][2];中,在除了sizeof(s)以为的任何表达式计算中s就是&s[0]。
C多维数组的定义就是数组的数组。因此数组s[0]是含有2个int型元素的数组,而数组s是含有3个和s[0]一样的元素的数组。即使三维数组也是一样。int x[3][4][5]的话,x有三个元素,都是二维数组,x的值等于&x[0];比如x[1]有4个元素,是一维数组,x[1]的值等于&x[1][0];类似x[2][2]有5个元素,是int型,x[2][2]的值是&x[2][2][0]。scanf("%d", x[2][2])是读取x[2][2][0]的正确写法。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-03-08

x的类型是个 int(*)[2], 就是说x每加1会偏移2个int的长度,所以scanf("%d",x[i]); 会输入x[0][0],x[1][0],x[2][0];,再往后就越界了。你要用循环6次的方式输入x数组,那就必须使参数地址的步长是1个int,也就是把x的类型强制转换为int*,这样:

for(i=0;i<6;i++) 

 scanf("%d",&((int*)x)[i]); //把x强制转换为int*,这样每次i+1就偏移1个int了

本回答被提问者采纳
第2个回答  2014-03-08

你分析的对,scanf("%d",a[i]);中的a[i]就是int类型的指针,但与输入格式“%d”的要求是不符的,应该写作scanf("%d",*a[i]);,效果相当于scanf("%d",&a[i][0]);。如果需要给6个单元赋值,可写作

int a[3][2],*p = &a[0][0];
for(i = 0; i < 6; ++i,++p)
    scanf("%d",p);

第3个回答  2014-03-08
应该写成scanf("%d",&a[i]);追问

你以为我是在骗你?我说了程序没错,完整的代码如下,自己写写看,没有错误呀:
#include
main()
{
int x[3][2]},i;
for(i=0;i<3;i++) scanf("%d",x[i]);
printf("%d\t%d\t%d\n",x[0][0],x[1][0],x[2][0]);
}

追答

程序默认为x[0][0],x[1][0],x[2][0],即二维数组首元素赋值。x[i],(i=1,2,3)相当于三个首地址

相似回答