[英]How to increment a pointer in C (2d array)
我需要在C中增加一个指针。我正在一个函数,该函数计算两个矩阵的总和,并将这些矩阵作为指向2d数组的指针( double** matrix1
作为参数)。 现在我不知道如何增加该指针。
我可以仅将*matrix1++
用于第一个指针,并将**matrix1++
用于第二个指针吗? 或者我如何分别增加每个指针?
编辑:这是应如何声明函数:
void matplus(int n,double ** A,double ** B,double ** C)
n是矩阵的维数(目前仅是二次矩阵),A和B是两个矩阵,C是结果矩阵。
我将对这个问题的框架进行一些挑战:您没有使用正确的“二维数组”作为数据结构。
在C语言中,您可以选择使用灵活的数组范围来调用函数。 这使您的数组可以是矩形的 ,即,大小相等的行连续排列在内存中。 一个简单的实现:
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
void sq_matrix_mul( const ptrdiff_t n,
const double left[n][n],
const double right[n][n],
double product[n][n] )
{
for ( ptrdiff_t i = 0; i < n; ++i )
for ( ptrdiff_t j = 0; j < n; ++j ) {
product[i][j] = 0.0;
for ( ptrdiff_t k = 0; k < n; ++k )
product[i][j] += left[i][k] * right[k][j];
} // end for j
}
#define DIMENSION 4
int main(void)
{
static const double a[DIMENSION][DIMENSION] = {
{ 1, 0, 0, 0 },
{ 0, 2, 0, 0 },
{ 0, 0, 3, 0 },
{ 0, 0, 0, 4 }
};
static const double b[DIMENSION][DIMENSION] = {
{ 1, 1, 1, 1 },
{ 1, 1, 1, 1 },
{ 1, 1, 1, 1 },
{ 1, 1, 1, 1 }
};
double c[DIMENSION][DIMENSION];
sq_matrix_mul( DIMENSION, a, b, c );
for ( ptrdiff_t i = 0; i < DIMENSION; ++i ) {
fputs( "[ ", stdout );
for ( ptrdiff_t j = 0; j < DIMENSION; ++j )
printf( "%f ", c[i][j] );
fputs( "]\n", stdout );
}
return EXIT_SUCCESS;
}
当然,还有比O(N³)更复杂的数组乘法算法,其运行时间更好。
由于矩形数组的元素在内存中是连续的,因此,如果您确实想在它们中进行递增(例如将每个矩阵元素设置为相同的值),则只需初始化指向第一个元素的指针并对其进行递增。
您使用的数据结构double**
是一个参差不齐的数组 。 几乎从来没有真正想要的数据结构(不幸的是,所有C和C ++程序员都首先了解char** argv
)。 参差不齐的数组需要每行动态分配,而不是整个矩阵分配一个动态行,每次访问都添加一个指针查找,并且数据局部性差,这使得它们慢得多。 它们还会在所有这些指针上浪费内存。
如果数组是稀疏的,则存在更有效的数据结构,例如压缩的稀疏行。 如果它很密集,并且所有行的大小都相同,则矩形阵列严格优于粗糙的阵列。
如果您确实想使用粗糙的数组,只需使用之前做过的函数原型,并保持循环不变即可。 数组索引(例如a[i][k]
适用于参差不齐的数组或矩形数组。
我个人的喜好是对数组索引使用ptrdiff_t
(减去指针时得到的类型),因为它们是有符号的,不会像无符号类型那样从静默溢出和类型提升中产生许多错误。 它们也是正确的宽度,不限于64位系统上的32位。
最后,在C ++中,此解决方案将是非法的。 我通常会编写一个二维数组类来提供零成本的抽象。
我认为如果要计算2个矩阵的总和,就应该像这样增加两个指针
**arrayptr++;
这是因为如果arrayptr
指向2d矩阵,则*arrayptr
指向其中的第一个元素即1d数组。 为了计算总和,您需要对构成矩阵的一维数组中的每个元素进行迭代。 因此,使用**arrayptr
访问这些元素。
如果我错了纠正我。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.