[英]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.