реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> указатель на указатель
toweroff
сообщение Oct 12 2012, 19:32
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



что-то туплю совсем

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

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

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

правильно?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 12 2012, 20:18
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(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);
Go to the top of the page
 
+Quote Post
toweroff
сообщение Oct 12 2012, 20:47
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(_Артём_ @ Oct 13 2012, 00:18) *
value-то запишется, но если передается мне в функцию, то ptr- параметр функции, то есть не сохранится.
Можно передать его в функцию как ссылку.

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

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

UPD

да, в плюсах работает... в сях бы, кейл матерится на конструкции *& sad.gif
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 12 2012, 21:26
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



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


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

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

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

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

Кейл - он же тоже ++ (видел есть у него примеры то ли с STL. то ли просто с template).
Это по умолчанию, он прикидывается что только СИ древней версии, надо в настройках проекта искать, как его ++-режим включить(или версию си поновей включить).
И зачем вообще "присто си"?
Go to the top of the page
 
+Quote Post
toweroff
сообщение Oct 12 2012, 21:33
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



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

да нет, в кейле наоборот есть галка "Strict ANSI C", которая выключена
тоже сил уже нет, пободаюсь немного, да спать... но собака порылась где-то рядом, хочется на костях поплясать sm.gif
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 12 2012, 21:56
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(toweroff @ Oct 13 2012, 00:33) *
да нет, в кейле наоборот есть галка "Strict ANSI C", которая выключена

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

Go to the top of the page
 
+Quote Post
toweroff
сообщение Oct 12 2012, 22:01
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



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

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

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

    set_ptr(&ptr, 10);
}
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 16:23
Рейтинг@Mail.ru


Страница сгенерированна за 0.014 секунд с 7
ELECTRONIX ©2004-2016