Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
valera0006
0 / 0 / 0
Регистрация: 12.06.2012
Сообщений: 4
1

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

07.12.2013, 10:07. Просмотров 1423. Ответов 6
Метки нет (Все метки)

В процессе реализации сортировки пузырьком натолкнулся на такую проблему: как поменять значения указателей, передаваемых в функцию. Если задать указатели прямо, то можно поменять их значения и по ссылке и по указателю на указатель:

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 вроде подходит..

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

Указатель или ссылка на указатель. В чем разница?
Есть вопрос про указатели и ссылки на указатели :scratch: Хочу в функциях...

Константный указатель или указатель на константу?
Привет всем.Уважаемые программисты пожалуйста скажите чем отличать когда...

указатель на указатель или присваивание объекта
Доброе утро. Вот я в своем классе создал параметр class TTo4ka { ......

Как правильно удалять выделенную память под указатель на указатель?
есть код #include <iostream> #include <conio.h> #include <stdlib.h>...

Расскажите, как здесь работает указатель на указатель?
#include "stdafx.h" #include <iostream> #include <locale.h> using namespace...

6
monolit
188 / 187 / 46
Регистрация: 24.03.2011
Сообщений: 670
Завершенные тесты: 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);
1
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)); не проходит
0
monolit
188 / 187 / 46
Регистрация: 24.03.2011
Сообщений: 670
Завершенные тесты: 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])
//а тут он знает, что передается по ссылке, и все норм
0
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, тогда, конечно особо разницы бы не было - менять значения переменных или адреса в указателях
0
monolit
188 / 187 / 46
Регистрация: 24.03.2011
Сообщений: 670
Завершенные тесты: 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;
}
Профит!
А у тебя да, ссылки поменять не получится. указатели - да, ссылки - нет.
1
valera0006
0 / 0 / 0
Регистрация: 12.06.2012
Сообщений: 4
07.12.2013, 17:53  [ТС] 7
Спасибо! - только что об этом подумал)
0
07.12.2013, 17:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.12.2013, 17:53

Почему указатель на указатель объявляется как float **A;
Почему float?

Указатель на ссылку или что это такое?
void add(char aData, Branch *&amp;aBranch); Речь об аргументе aBranch. Как это...

Функция, принимающая указатель и число байт и выделяющая память под указатель
Здравствуйте. Задача легкая, но почему-то завис Нужно написать функцию,...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru