Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

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

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

07.12.2013, 10:07. Просмотров 1191. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как получить ссылку на указатель или указатель на указатель в массиве? (C++):

Указатель или ссылка на указатель. В чем разница? - C++
Есть вопрос про указатели и ссылки на указатели :scratch: Хочу в функциях f1() и в f2() динамически выделить память и возвратить этот...

указатель на указатель или присваивание объекта - C++
Доброе утро. Вот я в своем классе создал параметр class TTo4ka { ... TGrup **MyGrup; ... };

Как правильно удалять выделенную память под указатель на указатель? - C++
есть код #include <iostream> #include <conio.h> #include <stdlib.h> #include <time.h> using namespace std; void sort_1(const...

Расскажите, как здесь работает указатель на указатель? - C++
#include "stdafx.h" #include <iostream> #include <locale.h> using namespace std; void main() { setlocale(LC_ALL, "rus"); ...

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

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

6
monolit
186 / 185 / 22
Регистрация: 24.03.2011
Сообщений: 669
Завершенные тесты: 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
186 / 185 / 22
Регистрация: 24.03.2011
Сообщений: 669
Завершенные тесты: 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
186 / 185 / 22
Регистрация: 24.03.2011
Сообщений: 669
Завершенные тесты: 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
Привет! Вот еще темы с ответами:

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

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

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

Реализация двоичных деревьев поиска: Зачем в параметрах функции используется указатель на указатель - C++
Всем привет, встретил в книге такой пример добавления узла в дерево: typedef struct tree { int data; tree *left, *right,...


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

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

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