Указатель на указатель структуры - PullRequest
0 голосов
/ 09 декабря 2018

Я немного запутался в этом вопросе.Допустим, у меня есть такая структура:

typedef struct
{
    char a;
    int num;
} 
t_per;

, и я хочу отсортировать t_per* data по num.Тогда я бы сделал что-то вроде:

void sort(t_per* data)
{
    int i = 0, j = 0;
    t_per aux;
    for(i = 0; data[i].num != 0; i++)
    {
        for(j = i + 1; data[j].num != 0; j++)
        {
            if(data[i].num > data[j].num)
            {
                aux = data[i];
                data[i] = data[j];
                data[j] = aux;
            }
        }
    }
}

Но что, если у меня есть t_per** data?Это будет правильно?

void sort(t_per** data)
{
    int i = 0, j = 0;
    t_per aux;
    for(i = 0; (*data[i]).num != 0; i++)
    {
        for(j = i + 1; (*data[j]).num != 0; j++)
        {
            if((*data[i]).num > (*data[j]).num)
            {
                aux = *data[i];
                *data[i] = *data[j];
                *data[j] = aux;
            }
        }
    }
}

Отредактировано для разборчивости.

1 Ответ

0 голосов
/ 10 декабря 2018

Явная запись data в виде массива указателей может помочь.Я не уверен в вашей цели использовать t_per**, и в целом она принята для уменьшения стоимости копирования t_per структур.Этот вид сортировки будет манипулировать массивом, в котором хранятся указатели на структуры, и заменяет указатели в массиве, а не на t_per.Это должно быть точно так же, как void sort(T_PER[] data) в таких языках, как java, где объекты сами являются указателями.

void sort(t_per* data[])
{
    int i = 0, j = 0;
    t_per* aux;
    for(i = 0; data[i]->num != 0; i++)
    {
        for(j = i + 1; data[j]->num != 0; j++)
        {
            if (data[i]->num > data[j]->num)
            {
                aux = data[i];
                data[i] = data[j];
                data[j] = aux;
            }
        }
    }
}

Но если вы решили писать или обмениваться непосредственно на t_per объектах, ваш код будет работать.В любом случае вы должны убедиться, что data является массивом, в котором хранится t_per*.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...