Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Можно ли передать указатель по ссылке ?

1.0K
22 февраля 2006 года
diesel_den
169 / / 22.12.2005
Если можно, приведите пожалуйста пример
3
22 февраля 2006 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by diesel_den
Если можно, приведите пожалуйста пример



void func(int*& p);

Если ты имел в виду указатель на ссылку, то этого сделать нельзя. Да и зачем?

324
22 февраля 2006 года
AndreySar
532 / / 01.08.2004
Цитата:
Originally posted by Green
void func(int*& p);

Если ты имел в виду указатель на ссылку, то этого сделать нельзя. Да и зачем?



void func(int*& p); это разъименование указателя, т.е. ты написал void func(int p);
&p - это ссылка на р, а *&р - это р.

1.8K
22 февраля 2006 года
k3Eahn
365 / / 19.12.2005
Цитата:
Originally posted by diesel_den
Если можно, приведите пожалуйста пример


Может так - void func(void **ppv);

3
22 февраля 2006 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by AndreySar
void func(int*& p); это разъименование указателя, т.е. ты написал void func(int p);
&p - это ссылка на р, а *&р - это р.


Да что ты говоришь...
Где ты видел разыменование в объявлении функции?

324
23 февраля 2006 года
AndreySar
532 / / 01.08.2004
Цитата:
Originally posted by Green
Да что ты говоришь...
Где ты видел разыменование в объявлении функции?



Я это видел только у тебя.
Что будет в результате в передаваемом параметре?

534
23 февраля 2006 года
HarryAxe
448 / / 19.01.2006
Цитата:
Originally posted by Green
Да что ты говоришь...
Где ты видел разыменование в объявлении функции?

Без Б... В декларациях & означает объявление ссылки, а как оператор адреса он интерпретируется только в самом коде. Нету там никакого "разыменования"

3
23 февраля 2006 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by AndreySar
Я это видел только у тебя.
Что будет в результате в передаваемом параметре?


Попробуй на примере, это не сложно.

Даже пример напишу :)

Код:
void func(int*& p)
{
    *p++ = 5;
}

int main()
{
    int a[]={1,2};
    int* p = a;
    func(p);
    *p = 7;

    return 0;
}
1.0K
23 февраля 2006 года
diesel_den
169 / / 22.12.2005
Цитата:
Originally posted by Green
void func(int*& p);

Если ты имел в виду указатель на ссылку, то этого сделать нельзя. Да и зачем?



void func(int*& p); - вы абсолютно правы.
Такая функция компилиться без проблем.
Но не компилиться её вызов:

 
Код:
char* p;
func(p);

- компилер говорит, что не может тип char* привести к типу char*&.
1.0K
23 февраля 2006 года
diesel_den
169 / / 22.12.2005
Цитата:
Originally posted by AndreySar
void func(int*& p); это разъименование указателя, т.е. ты написал void func(int p);
&p - это ссылка на р, а *&р - это р.



Чё то мне не вериться, что вы профи :)

1.0K
23 февраля 2006 года
diesel_den
169 / / 22.12.2005
Цитата:
Originally posted by Green
Попробуй на примере, это не сложно.

Даже пример напишу :)
Код:
void func(int*& p)
{
    *p++ = 5;
}

int main()
{
    int a[]={1,2};
    int* p = a;
    func(p);
    *p = 7;

    return 0;
}



Данный пример не относиться к теме.
Мне нужно поменять значение указателя, а не то, на что он указывает.

3
23 февраля 2006 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by diesel_den
Данный пример не относиться к теме.
Мне нужно поменять значение указателя, а не то, на что он указывает.


а p++ разве не меняет значения указателя? :)

3
23 февраля 2006 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by diesel_den
void func(int*& p); - вы абсолютно правы.
Такая функция компилиться без проблем.
Но не компилиться её вызов:
 
Код:
char* p;
func(p);

- компилер говорит, что не может тип char* привести к типу char*&.


Какой компилятор не компилит?

324
23 февраля 2006 года
AndreySar
532 / / 01.08.2004
Цитата:
Originally posted by Green
Попробуй на примере, это не сложно.

Даже пример напишу :)
Код:
void func(int*& p)
{
    *p++ = 5;
}

int main()
{
    int a[]={1,2};
    int* p = a;
    func(p);
    *p = 7;

    return 0;
}



Да, я был не совсем прав.
По ходу у меня возникло несколько вопросов:
*p++ = 5; что ты хотел сказать этим выражением?
*p++ - изменяет значение указателя, а *р += 1 - изменяет, то на что он указывает
с char действительно странно работает, хотя компилится без проблем.

1.0K
23 февраля 2006 года
diesel_den
169 / / 22.12.2005
Цитата:
Originally posted by Green
Какой компилятор не компилит?


C++ Visual Studio 7 (2003/.NET)

324
23 февраля 2006 года
AndreySar
532 / / 01.08.2004
Цитата:
Originally posted by diesel_den
C++ Visual Studio 7 (2003/.NET)



А ты все правильно делал??? Толлько что все сделал, все нормально откомпилировалось

3
23 февраля 2006 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by AndreySar
Да, я был не совсем прав.
По ходу у меня возникло несколько вопросов:
*p++ = 5; что ты хотел сказать этим выражением?


изменяем значение в переменной, на которую указывает указатель, далее изменяем (инкремент) значение самого указателя.
Что непонятного?

Цитата:
Originally posted by AndreySar

C++ Visual Studio 7 (2003/.NET)


У меня все ок. Покажи весь свой тестовый пример.

324
24 февраля 2006 года
AndreySar
532 / / 01.08.2004
Цитата:
Originally posted by Green
изменяем значение в переменной, на которую указывает указатель, далее изменяем (инкремент) значение самого указателя.
Что непонятного?



это не так интересно, меня больше интересует почему *р++ != *р =+ 1, это же эквивалентные операции

534
24 февраля 2006 года
HarryAxe
448 / / 19.01.2006
Цитата:
Originally posted by AndreySar
это не так интересно, меня больше интересует почему *р++ != *р =+ 1, это же эквивалентные операции


Для C++ характерен префиксный синтаксис выражений (выражения читаются слева направо и группируются в соответствии с приоритетами операторов). По этому *p++ = 2 раскладывается как *(p++) = 2 (по этой причине ввели оператор a->b, заменяющий (*a).b . Если бы мы написали *a.b, то выражение не скомпилилось бы, т.к. было бы интерпретировано как *(a.b) ). *p += 1 просто инкрементирует косвенное значение, т.к. приоритет += ниже приоритета *. Почитай Страуструпа, он об этом достаточно подробно написал

3
24 февраля 2006 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by AndreySar
это не так интересно, меня больше интересует почему *р++ != *р =+ 1, это же эквивалентные операции


Это не эквивалентные операции.
Приоритет постфиксного инкремента выше, чем у операции разыменования. Поэтому сначала происходит постфиксныф инкремент указателя, а потом разыменование.
Это довольно подробно расписано у Страуструпа.
Даже приведен такой пример копирования C-style строк:

while( *dest++ = *src++ );

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог