индекс обмена в 2D массиве с использованием указателя в C - PullRequest
0 голосов
/ 22 марта 2020

У меня проблема с обменом значений индекса в двумерном массиве с помощью указателя. Мой код, например, имеет двумерный массив с инициализацией {{1,2},{2,3},{3,4},{4,5}}, и я хочу обменять значения двух индексов в двумерном массиве. Я создал функцию с именем swap следующим образом:

void swap(double points[20][2],int i, int j){
    double *a,*b;
    a= *(*(points +i)+ 0;
    *(*(points +i)+ 0 = points[j][0];
    *(*(points +j)+ 0 = a;
    b= *(*(points +i)+ 1;
    *(*(points +i)+ 1 = points[j][1];
    *(*(points +j)+ 1 = a;
} 

i, j здесь означает, что я хочу изменить индекс i на j и наоборот, например, когда я используется swap(points,0,1) точки 2D-массива будут меняться следующим образом: {{2,3},{1,2},{3,4},{4,5}} Любая помощь будет оценена.

Ответы [ 2 ]

2 голосов
/ 22 марта 2020

Вы можете рассматривать двумерный массив как указатель на одномерные массивы и выполнять обмен с использованием временного массива, например:

void swap(double points[20][2],int i, int j) {
    double tmp[2];
    memcpy(tmp, points+i, sizeof(*points));
    memcpy(points+i, points+j, sizeof(*points));
    memcpy(points+j, tmp, sizeof(*points));
}

demo

реализация - это classi c swap, т. е.

tmp = points[i];
points[i] = points[j];
points[j] = tmp;

, но поскольку массивы в C нельзя назначать как единое целое, вместо них используется memcpy.

2 голосов
/ 22 марта 2020

Здесь вы

void swap( double points[][2], size_t i, size_t j )
{
    double ( *a )[2] = points + i;
    double ( *b )[2] = points + j;

    for ( size_t i = 0; i < 2; i++ )
    {
        double tmp = ( *a )[i];
        ( *a )[i] = ( *b )[i];
        ( *b )[i] = tmp;
    }
} 

Или полностью без оператора индекса

void swap( double points[][2], size_t i, size_t j )
{
    double ( *a )[2] = points + i;
    double ( *b )[2] = points + j;

    for ( size_t i = 0; i < 2; i++ )
    {
        double tmp = *( *a + i );
        *( *a  + i ) = *( *b  + i );
        *( *b + i ) = tmp;
    }
} 

Вот демонстрационная программа

#include <stdio.h>

#define N   2

void swap( double points[][N], size_t i, size_t j )
{
    double ( *a )[N] = points + i;
    double ( *b )[N] = points + j;

    for ( size_t i = 0; i < N; i++ )
    {
        double tmp = *( *a + i );
        *( *a  + i ) = *( *b  + i );
        *( *b + i ) = tmp;
    }
} 

int main(void) 
{
    double points[][N] =
    {
        { 1, 2 }, { 2, 3 }, { 3, 4 }, { 4, 5 }
    };

    const size_t M = sizeof( points ) / sizeof( *points );

    for ( size_t i = 0; i < M; i++ )
    {
        printf( "{ %.1f, %.1f } ", points[i][0], points[i][1] );
    }

    putchar( '\n' );

    swap( points, 0, 1 );

    for ( size_t i = 0; i < M; i++ )
    {
        printf( "{ %.1f, %.1f } ", points[i][0], points[i][1] );
    }

    putchar( '\n' );

    return 0;
}

Выход программы

{ 1.0, 2.0 } { 2.0, 3.0 } { 3.0, 4.0 } { 4.0, 5.0 } 
{ 2.0, 3.0 } { 1.0, 2.0 } { 3.0, 4.0 } { 4.0, 5.0 } 
...