crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

Litkevich Yuriy
  опции профиля:
сообщение 12.2.2010, 0:51
Сообщение #1


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Наткнулся на такую запись:
static void createDA(XSQLDA *&sqlda)
{
...
}
sqlda - это что указатель на ссылку?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Iron Bug
  опции профиля:
сообщение 12.2.2010, 18:42
Сообщение #2


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


я думаю, что это простой аналог выражения **.
выражение TypeX *&X означает, что &X является выражением типа TypeX*, то есть, указателем на тип TypeX. а ссылка - просто переименование объекта X. таким образом, операнд X является указателем на TypeX.

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

вот пример тестового кода - ради интереса:
#include <iostream>

class bar
{
    private:
        int blablabla;
};

void foo(bar *&x)
{
    std::cout << "x=" << std::hex << x << std::endl;
}

int main()
{
    bar* px;
    std::cout << "px=" << std::hex << px << std::endl;
    foo(px);
    return 0;
}


пример вывода программы:
px=0x8048969
x=0x8048969


указатели px и x эквивалентны. ничего не создаётся. если будет ноль - он останется нулём. но, понятное дело, есть возможность изменить его значение внутри функции и тогда элемент по ссылке px уже будет содержать другое значение.

Сообщение отредактировал Iron Bug - 12.2.2010, 18:44
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 12.2.2010, 18:55
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(Iron Bug @ 12.2.2010, 18:42) *
я думаю, что это простой аналог выражения **.

Вроде я это и написал. Только ссылка на указатель является безопасной, потому что по ней нельзя передать что угодно, а только указатель на конкретный тип.

Цитата(Iron Bug @ 12.2.2010, 18:42) *
новый объект сам по себе не создаётся, ноль там или не ноль - безразлично. функция внутри должна проверять значение операнда и может его менять по своему усмотрению.

Я нигде не писал про создания новых объектов.
Попробуй скомпилировать свой пример:
#include <iostream>

class bar
{
    private:
        int blablabla;
};

void foo(bar *&x)
{
    std::cout << "x=" << std::hex << x << std::endl;
}

int main()
{
    bar* px;
    std::cout << "px=" << std::hex << px << std::endl;
    foo(px);    // все нормально
    foo( 0 );    // компилятор выдаст ошибку (хотя если бы была декларация bar **x - этого бы не произошло.)
    return 0;
}


Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 21.6.2025, 2:53