Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: указатель на указатель
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
toweroff
что-то туплю совсем

передается мне в функцию int **ptr

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

то есть, я так мыслю, получится *(*ptr++) = value;

правильно?
_Артём_
Цитата(toweroff @ Oct 12 2012, 22:32) *
надо - записать что-то по адресу самой переменной, на которую ссылается указатель, после чего этот указатель увеличить

то есть, я так мыслю, получится *(*ptr++) = value;

value-то запишется, но если передается в функцию, то ptr- параметр функции, то есть не сохранится.
Можно передать его в функцию как ссылку.

Типа так:
Код
void SetPtr(uint8_t *&p, uint8_t new_value)
{
    (*p++)=new_value;
}
uint8_t Buf0[8], Buf1[4];

uint8_t * p[2]={&Buf0[2], &Buf1[0]};
int main()
{
    SetPtr(p[0], 100);
    SetPtr(p[1], 200);
    SetPtr(p[1], 300);
toweroff
Цитата(_Артём_ @ Oct 13 2012, 00:18) *
value-то запишется, но если передается мне в функцию, то ptr- параметр функции, то есть не сохранится.
Можно передать его в функцию как ссылку.

это я понимаю, что параметр не сохраняется. Это просто значение. Но оно указывает на указатель, который указывает на переменную.
То есть, если я в функции разыменую это дело -- получу указатель, который могу изменить? И, разыменовывая этот уже разыменованный указатель, получу саму переменную

Сейчас попробую, спасибо.. я уж тут для скорости в виртуалку добрый старый борландец кинул )))

UPD

да, в плюсах работает... в сях бы, кейл матерится на конструкции *& sad.gif
_Артём_
Цитата(toweroff @ Oct 12 2012, 23:47) *
То есть, если я в функции разыменую это дело -- получу указатель, который могу изменить? И, разыменовывая этот уже разыменованный указатель, получу саму переменную


Что в этом есть, но чото под вечер не соображу...

Цитата(toweroff @ Oct 12 2012, 23:47) *
Сейчас попробую, спасибо.. я уж тут для скорости в виртуалку добрый старый борландец кинул )))

В самом бы кейле и проверять надо.
Я на ARMGCC проверял - работает (было бы странно если бы не заработало).

Цитата(toweroff @ Oct 12 2012, 23:47) *
UPD
да, в плюсах работает... в сях бы, кейл матерится на конструкции *& sad.gif

Кейл - он же тоже ++ (видел есть у него примеры то ли с STL. то ли просто с template).
Это по умолчанию, он прикидывается что только СИ древней версии, надо в настройках проекта искать, как его ++-режим включить(или версию си поновей включить).
И зачем вообще "присто си"?
toweroff
Цитата(_Артём_ @ Oct 13 2012, 01:26) *
Кейл - он же тоже ++ (видел есть у него примеры то ли с STL. то ли просто с template).
Это по умолчанию, он прикидывается что только СИ древней версии, надо в настройках проекта искать, как его ++-режим включить(или версию си поновей включить).
И зачем вообще "присто си"?

да нет, в кейле наоборот есть галка "Strict ANSI C", которая выключена
тоже сил уже нет, пободаюсь немного, да спать... но собака порылась где-то рядом, хочется на костях поплясать sm.gif
_Артём_
Цитата(toweroff @ Oct 13 2012, 00:33) *
да нет, в кейле наоборот есть галка "Strict ANSI C", которая выключена

Может файл нужно переименовать расширение поменять вместо *.c в *.cpp?
Хотя для плюсов этого наверное недостаточно.

toweroff
В общем вот так это работает:

Код
void set_ptr(int **p, int value)
{
    **p = value;
    (*p)++;
}

void main()
{
    int i;
    int ptr = &i;

    set_ptr(&ptr, 10);
}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.