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);
我正在尝试从二维数组中获取对角线值。例如..
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);