Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言编程——二维数组的求和_C_Pointers_Multidimensional Array_Function Pointers - Fatal编程技术网

C语言编程——二维数组的求和

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不等

我试图从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
不等同于
array[count][count]
,这是您需要实现的。
实现它的最佳方法是使用cleaner
array[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);