C 编程 - 二维数组求和

C Programming - Sum of 2D arrays

我正在尝试从二维数组中获取对角线值。例如..

10 20 30
10 20 30
10 20 30 

根据我的代码,我将 adding/summing 来自索引 [0][0] 的数字,索引 1 和索引 [2][2] 使用指针计算为 60。但是,当我构建 运行 时,它会 returns 计算内存地址。任何人都可以在这里解释问题吗? (我是 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],那是你需要达到的。
实现它的最佳方法是更简洁 array[count][count] 但如果您想从学习的角度坚持使用指针算法(同样,这不利于可读性和调试),您应该以这种方式访问​​元素:

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

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

取消引用它将为您提供该行的基地址。

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

见代码here

第一个参数调整为

int ( *array )[SIZE]

也就是说它是一个指针

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

*( 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

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

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