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

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

07.12.2013, 10:07. Просмотров 1336. Ответов 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 вроде подходит..

Буду очень признателен, если кто-нибудь подскажет, что здесь можно сделать.
http://www.cyberforum.ru/cpp-beginners/thread986997.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.12.2013, 10:07
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как получить ссылку на указатель или указатель на указатель в массиве? (C++):

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

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

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

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

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

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
Привет! Вот еще темы с решениями:

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

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

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

Как сделать функцию, возвращающую указатель на функцию (которая в свою очередь возвращает указатель на массив)
Изучаю c++ по одной книжке.Она говорить не умеет.. Так вот понадобилось...


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

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

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