簡體   English   中英

如何在C(2d數組)中增加指針

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM