gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:16:46 25 4
gpt4 key购买 nike

当我用 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

根据我对矩阵存储方式的理解,这应该可行。谁能指出我的代码有什么问题?

最佳答案

你将 A 声明为

int A[10][10];

也就是说,一个由 10 个数组组成的数组,每个数组包含 10 个 int。因此,当 A 衰减为指向其第一个元素的指针时,该指针的类型为 int (*)[10]。这是一个指向 10 个 int 数组的指针,而不是指向单个 int 的指针。不同之处在于它们与指针运算的交互。因为指针运算是根据所指向类型的大小定义的,所以只要 i 不为零,表达式 A + j + i*10 就会生成一个指针(指向10 个 int 的数组)在数组 A 的边界之外。

做你想做的最类型安全的方法是使用数组语法来选择数组元素:

&A[i][j]

.使用指针算法的类型正确替代方案包括

&(*(A + i))[j]

*(A + i) + j

后两者都依赖于表达式 A + i 是指向 int 数组的指针这一事实;取消对该指针的引用会生成一个数组,它可以是 [] 运算符的操作数(以及随后获取的结果的地址)。或者,当 *(A + i) 指定的数组作为+ 运算符,并向其添加 j 会产生指向数组 * 的 jth 元素的指针(A + i)(与 A[i] 指定的数组相同)。

关于c - 在 scanf 函数中使用指向矩阵的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43792668/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com