在使用scanf输入矩阵时,我正在玩指针,出于某种原因,当我运行此代码时,只有每行的第一个元素才能正确存储。
#include "stdio.h"
void main()
{
int i, j, n, A[10][10];
scanf("%d", &n);
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
scanf("%d", A + j + i*10);
}
这是我将1,2,3,4,5,6,7,9输入3x3矩阵并打印后得到的结果:
1 -858993460 -858993460
2 -858993460 -858993460
3 -858993460 -858993460
根据我对矩阵存储方式的理解,这应该有效。任何人都可以指出我的代码有什么问题吗?
答案 0 :(得分:3)
您将A
声明为
int A[10][10];
即10个10 int
个数组的数组。因此,当A
衰减到指向其第一个元素的指针时,该指针的类型为int (*)[10]
。这是一个指向10 int
s数组的指针,而不是指向单个int
的指针。差异之中是它们与指针算术的交互。因为指针算法是根据指向类型的大小定义的,所以只要i
非零,表达式A + j + i*10
就会产生一个指针(对于10 int
s的数组)数组的边界A
。
执行所需操作的最类型安全的方法是使用数组语法来选择数组元素:
&A[i][j]
。使用指针算法的类型正确的替代方法包括
&(*(A + i))[j]
和
*(A + i) + j
后两者都依赖于表达式A + i
是指向int
数组的指针这一事实;取消引用该指针会产生一个数组,该数组可以是[]
运算符的操作数(以及随后的结果的地址)。或者,*(A + i)
指定的数组在它作为int *
运算符的操作数出现时衰减为指向其第一个元素的指针(即衰减为+
),并添加{{1}这产生了一个指向数组j
的{{1}} th 元素的指针(与j
指定的数组相同)。
答案 1 :(得分:1)
指针数学错误。
*(A + i)
在A[i]
中使用A + j + i * 10
时,它将成为指向其第一个元素的指针,该元素是10 A
的数组。添加到A + j + i*10
的每个int
都会将其地址偏移40个字节。
建议改为使用1
。
代码重新工作以显示使用的地址。
A
输出
&A[i][j]