C语言编程——二维数组的求和
我试图从2D数组中获取对角线值。例如C语言编程——二维数组的求和,c,pointers,multidimensional-array,function-pointers,C,Pointers,Multidimensional Array,Function Pointers,我试图从2D数组中获取对角线值。例如 10 20 30 10 20 30 10 20 30 从我的代码中,我将使用计算到60的指针,将索引[0][0]中的数字与索引和索引[2][2]相加/求和。然而,当我构建并运行时,它会返回内存地址的计算结果。有人能在这里解释这个问题吗?(我不熟悉C编程和指针) void对角线2d(int数组[][SIZE],int行大小,int列大小,int*sum) { 整数计数; *总和=0; 对于(count=0;count,array+count+count不等
10 20 30
10 20 30
10 20 30
从我的代码中,我将使用计算到60的指针,将索引[0][0]中的数字与索引和索引[2][2]相加/求和。然而,当我构建并运行时,它会返回内存地址的计算结果。有人能在这里解释这个问题吗?(我不熟悉C编程和指针)
void对角线2d(int数组[][SIZE],int行大小,int列大小,int*sum)
{
整数计数;
*总和=0;
对于(count=0;count,array+count+count
不等同于array[count][count]
,这是您需要实现的。
实现它的最佳方法是使用cleanerarray[count][count]
,但如果您想从学习的角度坚持使用指针算法(同样,这对可读性和调试都不好),则应通过以下方式访问元素:
(*sum)+=*(*(array+count)+count);
通过这种方式,您可以将count
添加到基指针数组
,即count
第行的基地址的内存位置。它是指向指针的指针
取消对它的引用将为您提供行的基址
将count
添加到行的基指针将为您提供行的count
第th个元素的地址,取消引用将为您提供元素的值
请参阅代码,第一个参数调整为
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;
}
对于给定的问题,您应该使用以下代码
for(count = 0; count < size; count++)
sum=*( *( array + count ) + count);
for(计数=0;计数
*(数组+计数+计数)
-->数组[计数][计数]
@Han(*sum)+=*(*(数组+计数)+计数);我已经编辑了我的答案,它似乎起作用了,检查一下“使用指针”约束对未来的用户/访问者有何用处?微不足道的[xy][xy]索引更清晰。噢,谢谢!它起作用了:在OP代码段的上下文中“*(数组+计数*大小+计数)
”的计算结果不是int
!你是什么意思?被取消引用的内存位置对我来说看起来没问题。让我试试,等等,我想说int-array[][SIZE]
和int-array[SIZE]
是不一样的。执行int i=*(数组+计数*大小+计数);
不会达到您的预期效果。如果我以前写了错误的东西,我很抱歉,希望我没有把您弄糊涂!@Han看到我的演示程序,并将其输出与您的输出进行比较,以找出差异。可能在printf调用中,您使用的是expression&sum而不是sum。
sum = 60
for(count = 0; count < size; count++)
sum=*( *( array + count ) + count);