关于c语言中二维数组的地址问题?#include〈stdio.h〉
void main()
{
int i,j,a[3][3];
for(i=0;i<3;i++)
for(j=0;j<3;j++)
printf(“%d”,a[j][i]);
}
上面的例子按照c中按行输出的规定输出格式是
a[0][0],a[1][0],a[2][0]
a[0][1],a[1][1],a[2][1]
a[0][2],a[1][2],a[2][2]
请问a[j][i]的下标变量00 10 20。相对于a[i][j]的下标变量00 01 02。符合c对于数组的定义(按序排列的占用相临存储空间的具有相同类型的变量的集合)吗?如果我要引用a[j][i]中与a[0][0]相临的第二个元素下标的地址,是10 还是01。
这个例子中的问题呢
追答你的例子想说明什么问题?
追问我想问在内外循环不变的情况下在输出时,数组a[i][j]变成数组a[j][i],当我想引用a[j][i]数组中a[0][0]的下一个下标变量它是哪一个,如果是a[0][1]那么它是否符合c对数组进行按行存储的规定,如果是a[1][0]那么是否说明c对数组的定义说明(按序排列的)是错误的。
追答不知道你在说什么,说这些一点意义都没有
追问我想知道c在这个程序上的运行规则,这样以后才可以更好的运用,如果每次碰到不理解的就放弃,那怎么走的更远,既然你不知道我在说什么,那又为什么说我的问题没意义呢!如果你理解这个问题没意义,是那些没意义呢?如果真的没意义,c上为什么还要把它拿出来讲解呢?是不是说明这个知识的局限性呢
追答那你说如果你理解了,方便解决什么问题,如果不理解就解决不了的问题。你能举出这个例子么?
追问首先,我是初学者,可能考虑问题有局限性,思维也许有不符合逻辑的地方,所以我才去理解别人的逻辑来印证自己的逻辑,或者说是c在计算机上的逻辑或者规则,我就是想知道当当上例中数组a[i][j]变成a[j][i]那下标变量是按00 01 02 10 11 12 20 21 22这样排序还是按00 10 20 01 11 21 02 12 22这样排序。
追答只要你是用下标来访问,内部怎么存储就毫无关系。
追问前辈,我还有个困惑,是关于输入输出的,还希望能解惑下。
scanf()函数输入问题比如下面的例子:#include〈stdio.h〉
void main()
{
int i,j,a[3][3];
for(i=0;i<3;i++)
for(j=0;j<3;j++)
if((i+j)%2)
printf(“%d”,a[i][j]);
}
请问可以把 printf(“%d”,a[i][j]);换成scanf(“%d”&a,[i][j])吗?为什么?
换成scanf(“%d”,&a[ij][])
换成scanf(“%d”,&a[i][j])
追答不能。下标完全变了。而且多半越界。
追问她是全部输入a[0][0]到a[2][2]的值,还是会经过if((i+j)%2)这个单分支选择结构的语句限制后输出部分
越界是指的什么?我是初学者不懂这些术语
追答两个坐标加起来为偶数,没有什么特定意义,不值得讨论。
追问它会限制输出吗
它会限制输入吗
输出我打错了是输入
追答会限制输出,筛选两个下标和为偶数的
追问因为高度不同,条件不同,所以前辈认为的没意义对我来说还是很有意义的。不论怎样谢谢了,我在蹭网,很冷的,不聊了。
会限制输入吗?
可在a[j][i]中先行是00 10 20 01 11 21 02 12 22