C编程 - 二维数组的总和
我想从二维数组中获得对角线值的值。例如..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);
}
}
第一个参数被调整到
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
@Han看到我的演示程序,并将其输出与输出进行比较以找出差异。也许在printf调用中,您使用表达式和总和而不是总和。 –
这array+count+count
不等同于array[count][count]
,那就是你需要达到的目标。
你能达到的最好方法是清洁array[count][count]
但如果你想使用指针运算坚持从学习的角度来看(再次,这是不好的可读性和调试),你应该访问的元素是这样的:
(*sum)+=*(*(array+count)+count);
通过这种方式,您可以将count
添加到基址指针array
,即count
第th行的基址的存储位置。这是一个指针指针。
解引用它会给你该行的基地址。
将count
添加到行的基指针将为您提供行的count
th元素的地址,并且取消引用它将为您提供该元素的值。
见代码here
由于给定的问题,你应该使用下面的代码。
for(count = 0; count < size; count++)
sum=*(*(array + count) + count);
'*(数组+计数+计数)' - >'阵列[COUNT] [COUNT]' – BLUEPIXY
@Han(*总和)+ = *(*(数组+计数)+计); –
我编辑了我的答案,它似乎工作,检查出来 – magicleon