Форум программистов, компьютерный форум CyberForum.ru

Как получить ссылку на указатель или указатель на указатель в массиве? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.88
valera0006
0 / 0 / 0
Регистрация: 12.06.2012
Сообщений: 4
07.12.2013, 10:07     Как получить ссылку на указатель или указатель на указатель в массиве? #1
В процессе реализации сортировки пузырьком натолкнулся на такую проблему: как поменять значения указателей, передаваемых в функцию. Если задать указатели прямо, то можно поменять их значения и по ссылке и по указателю на указатель:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void Swap1(char** first, char** second ){
    char* temp = *first;
    *first = *second;
    *second = temp;
}
void Swap2(char* &first, char* &second )
{
    char* temp = first;
    first = second;
    second = temp;
}
void main(){ 
 
    char a = 'a';
    char b = 'b';
 
    char* pa = &a;
    char* pb = &b;
    
    Swap1(&pa, &pb); //or
    Swap2(pa, pb);
}
таким образом, если объекты - не char, а гораздо большие по объему, то такой обмен будет более быстрым, нежели обмен присваиваниями по значению.

Вопрос, как обращаться к функции swap или swap2 (лучше через ссылки) в цикле прохода по массиву? У меня код:
void main()
C++
1
2
3
4
5
6
7
8
9
10
{ 
        
    char* mas = new char[3];
    mas[0] = 'a'; mas[1] = 'b'; mas[2] = '\0';
 
    char* a = &(mas[0]);
    char* b = &(mas[1]);
    //предположим, где-то в цикле
    Swap2(mas, &(mas[1]));
}
выдает ошибку " error C2664: 'Swap2' : cannot convert parameter 2 from 'char *' to 'char *&' ", т. е. ссылка таким образом не объявляется? Хотя, mas вроде подходит..

Буду очень признателен, если кто-нибудь подскажет, что здесь можно сделать.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.12.2013, 10:07     Как получить ссылку на указатель или указатель на указатель в массиве?
Посмотрите здесь:

указатель на указатель или присваивание объекта C++
Указатель или ссылка на указатель. В чем разница? C++
Реализация двоичных деревьев поиска: Зачем в параметрах функции используется указатель на указатель C++
Функция, получающая указатель на обычную функцию, получает указатель на метод класса C++
Расскажите, как здесь работает указатель на указатель? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
monolit
179 / 179 / 21
Регистрация: 24.03.2011
Сообщений: 641
Завершенные тесты: 1
07.12.2013, 11:11     Как получить ссылку на указатель или указатель на указатель в массиве? #2
Для начала:
C++
1
2
char* a = mas;
char* b = mas+1;
Цитата Сообщение от valera0006 Посмотреть сообщение
void Swap1(char** first, char** second ){
* * char* temp = *first;
* * *first = *second;
* * *second = temp;
}
void Swap2(char* &first, char* &second )
{
* * char* temp = first;
* * first = second;
* * second = temp;
}
Вот уж чушь) Зачем тебе ссылки, у тебя указатель - ссылка, а передача по ссылке предназначена для другого (чур к словам не придираться). Делай так:
C++
1
2
3
4
5
6
void Swap2(char* first, char* second )
{
 char* temp = first;
 first = second;
 second = temp;
}
т.е. ты и так передаешь first / second по ссылке, а не по значению, а ссылки на ссылку не существует)
Но тут можно использовать этот swap и так:
C++
1
2
char a, b;
Swap2(&a, &b);
valera0006
0 / 0 / 0
Регистрация: 12.06.2012
Сообщений: 4
07.12.2013, 15:01  [ТС]     Как получить ссылку на указатель или указатель на указатель в массиве? #3
А здесь у меня возникает проблема - как в массиве указателей на структуру (а не на char - ) в функцию Swap передать именно адрес элемента массива с той целью, чтобы просто поменять местами "ссылки", а не копировать по значению все элементы структур.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
struct student{
     int id;
     int group;
     //куча полей
};
void SwapStudent(student** first, student** second )
{
    student* temp = *first;
    *first = *second;
    *second = temp;
}
 
void main()
{ 
    int sizeOfMas = 10;
    student* mas = new student[sizeOfMas];
    
    //инициализация элементов массива
 
    bool isPermutWas = false;
    int i, j;
    for (i = 0; i < (sizeOfMas - 1); i++)
    {
        isPermutWas = false;
        for (j = 0; j < (sizeOfMas - 1); j ++)
            if ((mas[j].id) > (mas[j + 1].id))
            {
                SwapStudent((mas + j),(mas + j + 1)); // как обратиться к адресу элемента массива?
                isPermutWas = true;
            }
            if (isPermutWas == false)
                break;
    }
    
    
}
и вызов SwapStudent(&(mas + j),&(mas + j + 1)); не проходит
monolit
179 / 179 / 21
Регистрация: 24.03.2011
Сообщений: 641
Завершенные тесты: 1
07.12.2013, 16:51     Как получить ссылку на указатель или указатель на указатель в массиве? #4
Вот почему тебя так тянет писать ссылку на ссылку?
C++
1
void SwapStudent(student** first, student** second )
Тебе что нужно делать, ссылки менять? Ну и пиши их:
C++
1
void SwapStudent(student* first, student* second )
Или еще вариант (использование будет отличаться)
C++
1
void SwapStudent(student& first, student& second ); //так наверное предпочтительнее
использовать так (в твоем случае):
C++
1
2
SwapStudent(&mas[i], &mas[j])
//типа он же ждет указатель, mas[i] же - объект, а &mas[i] как раз и есть этот указатель
для второго:
C++
1
2
SwapStudent(mas[i], mas[j])
//а тут он знает, что передается по ссылке, и все норм
valera0006
0 / 0 / 0
Регистрация: 12.06.2012
Сообщений: 4
07.12.2013, 17:34  [ТС]     Как получить ссылку на указатель или указатель на указатель в массиве? #5
Цитата Сообщение от monolit Посмотреть сообщение
C++
1
void SwapStudent(student* first, student* second )
Или еще вариант (использование будет отличаться)
C++
1
void SwapStudent(student& first, student& second ); //так наверное предпочтительнее
А. первый способ не работает, так как в вызываемой функции создаются две локальные переменные типа student* , успешно меняются их значения, а значения mas[i], mas[j] остаются постоянными:

1. В main() вызываем: Swap(&mas[1], &mas[2])

2.
C++
1
2
3
4
5
6
void Swap(student* first, student* second)
{
    student* temp = first; //&first != &mas[i] => создается новая локальная переменная типа student*
    first = second;
    second = temp;
}
3. Ничего не изменилось: main[1] и main[2] ссылаются туда же куда и раньше

Б. второй способ не применим, так как размер student большой, если бы был char или int, тогда, конечно особо разницы бы не было - менять значения переменных или адреса в указателях
monolit
179 / 179 / 21
Регистрация: 24.03.2011
Сообщений: 641
Завершенные тесты: 1
07.12.2013, 17:47     Как получить ссылку на указатель или указатель на указатель в массиве? #6
Я не говорил, что реализация твоего swap'a верна) Привел только примеры заголовков.
Если у тебя что-то большое в структуре, то используй не массив структур, а массив указателей на структуры. И тогда можно будет менять местами ссылки.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    student** mas = new student*[sizeOfMas ];
    //выделяешь еще память под каждого  mas[i]'го
    //инициализация элементов массива
 
    for (i = 0; i < (sizeOfMas - 1); i++) {
        ...
        for (j = 0; j < (sizeOfMas - 1); j ++)
            if ((mas[j].id) > (mas[j + 1].id)) {
                SwapStudent(mas[j],mas[j + 1]);
               ...
            }
           ...
    }
C++
1
2
3
4
5
void SwapStudent(student* f, student* s) {
student* temp = f;
f = s;
s = f;
}
Профит!
А у тебя да, ссылки поменять не получится. указатели - да, ссылки - нет.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.12.2013, 17:53     Как получить ссылку на указатель или указатель на указатель в массиве?
Еще ссылки по теме:

Почему указатель на указатель объявляется как float **A; C++
C++ Как сделать функцию, возвращающую указатель на функцию (которая в свою очередь возвращает указатель на массив)
C++ Как правильно удалять выделенную память под указатель на указатель?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
valera0006
0 / 0 / 0
Регистрация: 12.06.2012
Сообщений: 4
07.12.2013, 17:53  [ТС]     Как получить ссылку на указатель или указатель на указатель в массиве? #7
Спасибо! - только что об этом подумал)
Yandex
Объявления
07.12.2013, 17:53     Как получить ссылку на указатель или указатель на указатель в массиве?
Ответ Создать тему
Опции темы

Текущее время: 17:45. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru