Кажется, что автор пытается смоделировать двумерный динамический массив c с одномерным массивом.
То есть он выделил достаточно памяти, чтобы можно было содержать элементы двумерного массива типа
double vt[np][np];
и в подобных циклах
for ( i = 0; i < npl i++ )
{
for( j=0; j < np; j++ )
{
*(vt+i*np+j) = 0;
}
}
он пытается заполнить этот одномерный массив нулями, используя два индекса, как будто он работает с размерный массив.
Так что это выражение
*(vt+i*np+j)
является не чем иным, как разыменованием указателя для получения доступа к элементу одномерного массива с использованием арифметики указателя c.
Вместо этого вы могли бы написать, например,
for ( i = 0; i < np * np; i++ ) vt[i] = 0;
, где выражение vt[i]
эквивалентно *( vt + i )
.
Чтобы пояснить это, приведем демонстрационную программу.
#include <stdio.h>
#include <stdlib.h>
static void fill_array( double a[], size_t rows, size_t cols )
{
for ( size_t i = 0; i < rows; i++ )
{
for ( size_t j = 0; j < cols; j++ )
{
*( a + cols * i + j ) = cols * i + j;
}
}
}
int main(void)
{
size_t n;
printf( "Enter the size of a square matrix: " );
scanf( "%zu", &n );
double *a = malloc( n * n * sizeof( double ) );
fill_array( a, n, n );
for ( size_t i = 0; i < n; i++ )
{
for ( size_t j = 0; j < n; j++ )
{
printf( "%4.1f ", *( a + i *n + j ) );
}
putchar( '\n' );
}
free( a );
return 0;
}
Его вывод может выглядеть, например, как
Enter the size of a square matrix: 5
0.0 1.0 2.0 3.0 4.0
5.0 6.0 7.0 8.0 9.0
10.0 11.0 12.0 13.0 14.0
15.0 16.0 17.0 18.0 19.0
20.0 21.0 22.0 23.0 24.0