2017-09-10 87 views
1

我想从二维数组中获得对角线值的值。例如..C编程 - 二维数组的总和

10 20 30 
10 20 30 
10 20 30 

从我的代码,我将增加/从索引数[0]具有索引1和索引[2] [2]使用指针,其将计算到60 [0]求和。但是,当我构建并运行时,它将返回内存地址的计算。任何人都可以在这里解释问题? (我是新的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); 
    } 

} 

enter image description here

+2

'*(数组+计数+计数)' - >'阵列[COUNT] [COUNT]' – BLUEPIXY

+3

@Han(*总和)+ = *(*(数组+计数)+计); –

+0

我编辑了我的答案,它似乎工作,检查出来 – magicleon

回答

3

第一个参数被调整到

int (*array)[SIZE] 

即它是一个指针。

因此,表达式array + count也具有类型int (*)[SIZE]。为了让你必须取消引用指针

*(array + count) 

在这种情况下,阵列的相应的“行”你将有类型int[SIZE]的目的,这又在表达式

*(array + count) + count 

是隐式convered的类型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 
+0

@Han看到我的演示程序,并将其输出与输出进行比较以找出差异。也许在printf调用中,您使用表达式和总和而不是总和。 –

0

array+count+count不等同于array[count][count],那就是你需要达到的目标。
你能达到的最好方法是清洁array[count][count]但如果你想使用指针运算坚持从学习的角度来看(再次,这是不好的可读性和调试),你应该访问的元素是这样的:

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

通过这种方式,您可以将count添加到基址指针array,即count第th行的基址的存储位置。这是一个指针指针。

解引用它会给你该行的基地址。

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

见代码here

+0

在OP的片段的上下文“*'*(数组+计数* SIZE +计数)”*“不计算为”int“! – alk

+0

你是什么意思?解除引用的内存位置对我来说看起来不错。让我试试,等等 – magicleon

+0

我想说'int array [] [SIZE]'和'int array [SIZE]'是*不相同。 – alk

0

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

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