在scanf函数中使用指向矩阵的指针

时间:2017-05-04 20:57:31

标签: c pointers memory matrix scanf

在使用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

根据我对矩阵存储方式的理解,这应该有效。任何人都可以指出我的代码有什么问题吗?

2 个答案:

答案 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]