Вопрос, связанный с указателем в C внутри цикла - PullRequest
1 голос
/ 09 января 2020

Я очень плохо знаком с C и с трудом понимаю, что делают следующие строки кода C.

for(j=0;j<np;j++)
    *(vt+i*np+j) = 0;

Прежде чем предположить, что эти строки определили следующее:

int i=1,j,np=3;
double *vt;
vt=(double*)malloc(np*np*sizeof(double));

Кроме того, я не знаю, что может быть хорошим заголовком для этого вопроса?

1 Ответ

3 голосов
/ 09 января 2020

Кажется, что автор пытается смоделировать двумерный динамический массив 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
...