【问题标题】:C Programming - Sum of 2D arraysC 编程 - 二维数组的总和
【发布时间】:2017-09-10 09:57:57
【问题描述】:

我正在尝试从二维数组中获取对角线值的值。比如……

10 20 30
10 20 30
10 20 30 

从我的代码中,我将使用 index[0][0] 与 index1 和 index[2][2] 使用将计算为 60 的指针相加/相加。但是,当我构建和运行,它会返回内存地址的计算。任何人都可以在这里解释问题吗? (我是 C 编程和指针的新手)

void diagonals2D(int array[][SIZE], int rowSize, int colSize, int *sum)
{
    int count;
    *sum=0;

    for(count=0;count<SIZE;count++)
    {
        (*sum)+=*(array+count+count);
    }

}

【问题讨论】:

  • *(array+count+count) --> array[count][count]
  • @Han (*sum)+=*( *( array+count )+count);
  • 我已经编辑了我的答案,它似乎有效,检查一下
  • “使用指针”约束对未来的用户/访问者有何用处?琐碎的 [xy][xy] 索引更加清晰。
  • 哦,谢谢!它正在工作:D

标签: c pointers multidimensional-array function-pointers


【解决方案1】:

第一个参数调整为

int ( *array )[SIZE]

那就是它是一个指针。

所以表达式array + count 也有int ( * )[SIZE] 类型。要获取数组的相应“行”,您必须取消引用指针

*( array + count )

在这种情况下,您将拥有int[SIZE] 类型的对象,而该对象又出现在表达式中

*( array + count ) + count

隐式转换为int *.类型

现在解除对整个表达式的引用,您将获得目标元素

*( *( array + count ) + count )

最好将函数声明为具有变长数组的参数。

这是一个演示程序

#include <stdio.h>

void diagonals2D( long long int *sum, size_t n, int a[n][n] )
{
    *sum = 0;

    for ( size_t i = 0; i < n; i++ )
    {
        *sum += *( *( a + i ) + i );
    }
}

#define N   3

int main(void) 
{
    int a[][N] =
    {
        { 10, 20, 30 },
        { 10, 20, 30 },
        { 10, 20, 30 }      
    };

    long long int sum;

    diagonals2D( &sum, N, a );

    printf( "sum = %lld\n", sum );

    return 0;
}

它的输出是

sum = 60

【讨论】:

  • @Han 查看我的演示程序并将其输出与您的输出进行比较以找出差异。也许在 printf 调用中,您使用的是表达式 &sum 而不是 sum。
【解决方案2】:

那个array+count+count不等于array[count][count],那是你需要实现的。
实现它的最佳方法是更清洁的array[count][count],但如果您想从学习的角度坚持使用指针算法(同样,这不利于可读性和调试),您应该以这种方式访问​​元素:

(*sum)+=*(*(array+count)+count);

这样,您将count 添加到基指针array,即countth 行的基地址的内存位置。它是一个指向指针的指针。

取消引用它会给你行的基地址。

将count 添加到行的基指针将为您提供该行的第countth 元素的地址,取消引用它将为您提供该元素的值。

查看代码here

【讨论】:

  • 在 OP 的 sn-p 上下文中 "*(array + count * SIZE + count)" 不会评估为 int!
  • 什么意思?取消引用的内存位置对我来说看起来不错。让我试试,等等
  • 我想说int array[][SIZE]和int array[SIZE]是不一样的。
  • 执行int i = *(array + count * SIZE + count); 不会达到您的预期。
  • 对不起,如果我之前写错了,希望我没有混淆你!
【解决方案3】:

作为给定的问题,你应该使用下面的代码。

for(count = 0; count < size; count++)
   sum=*( *( array + count ) + count);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-05
    • 1970-01-01
    • 2011-06-19
    • 2016-07-05
    • 2013-03-16
    • 2022-12-31
    相关资源
    最近更新 更多