|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
05.05.2015, 11:32 | #1 |
Пользователь
Регистрация: 05.05.2015
Сообщений: 55
|
Двойной указатель
Здравстуйте! Помогите разобраться в следующем.
В программе есть 4 файла(лишний код вырезан): DAC.h : Код:
Код:
Код:
Код:
Как я понимаю, в файле DAC.c создается структура с указателями на функции для управления ЦАПом. И чтобы пользоваться этой структурой в файле Player.c, делается "связывание" через Main.c. Но почему не: Код:
Код:
|
05.05.2015, 13:27 | #2 |
МегаМодератор
СуперМодератор
Регистрация: 09.11.2010
Сообщений: 7,291
|
DAC объявлен как указатель в main. Все значения в си передаются по значению. Для того, чтобы иметь возможность изменить значение, нужно передать указатель на изменяемую переменную, поэтому функция принимает двойной указатель.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
|
05.05.2015, 16:24 | #3 | |
Пользователь
Регистрация: 05.05.2015
Сообщений: 55
|
Цитата:
Вот, так сказать, физически указатель DAC в main.c - это ячейка памяти, допустим, с адресом 0х0AAA. Она может содержать адрес переменной типа dac_interface. Но сначала содержит NULL. В строке DAC_Init(&DAC) передается в функцию адрес 0x0AAA. Теперь переходим в модуль DAC.c. В нем уже создана(на этапе компиляции) структура iDAC типа dac_interface, допустим, по адресу 0x0BBB. И вот дальше я не понимаю. Мы попадаем в функцию Код:
ИЛИ Создается локальная переменная(двойной указатель) **DAC. Она, допустим, размещается по адресу 0x0CCC. Далее строкой *DAC = (dac_interface *)&iDAC в ячейку 0x0CCC пишется значение 0x0BBB. А потом... потом... не знаю... по-ходу, у меня получается суп с котом... Разъясните, пожалуйста. Запутался что-то совсем. |
|
05.05.2015, 17:11 | #4 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,330
|
Если будет так:
Код:
В чем разница между: Код:
Код:
|
05.05.2015, 17:17 | #5 | ||||||
Старожил
Регистрация: 15.02.2010
Сообщений: 15,709
|
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
UPDATE: Давайте так: 1. у вас есть DAC - указатель, который лежит в ячейке 0xAAAA, т.е. формально *DAC == *(0xAAAA) == NULL 2. когда вы пишите Код:
после выхода из функции значение в 0хАААА, т.е. DAC не изменится 3. когда вы пишите Код:
после выхода из функции значение в 0хАААА, т.е. DAC изменится Последний раз редактировалось p51x; 05.05.2015 в 17:47. |
||||||
06.05.2015, 15:11 | #6 | |
Пользователь
Регистрация: 05.05.2015
Сообщений: 55
|
Извините, что поздно отвечаю. Пока только на работе получается разбираться.
Цитата:
Во втором - ожидается указатель на переменную типа int? Как я понимаю, указатели - это отдельный тип. И в первом, и во втором случе при попадании в функцию создается локальная переменная DAC. И в обоих случаях под эту переменную выделится одинаковый объем памяти (4 байта?). Только во втором случае локальная переменная DAC может хранить адрес переменной только типа int(и никакого другого). А в первом - адрес переменной типа указатель (которая в свою очередь хранит адрес переменной только типа dac_interface). Правильно? |
|
06.05.2015, 15:39 | #7 | ||
Старожил
Регистрация: 15.02.2010
Сообщений: 15,709
|
Цитата:
Цитата:
|
||
06.05.2015, 15:44 | #8 | |
Пользователь
Регистрация: 05.05.2015
Сообщений: 55
|
Также прошу прощения за поздний ответ.
Цитата:
Код:
Код:
Код:
Код:
А функция Код:
Извините за сумбур, если что. Это я к тому, что пишут: если функция ожидает int - даем ей int, если char - даем char. Соответственно, если указатель -даем указатель. Если двойной указатель - даем двойной. А она, оказывается, при наличии указателя в параметрах ждет адрес... Впрочем, адреса - это и есть указатели... Наверное... Последний раз редактировалось Programmer0; 06.05.2015 в 16:31. |
|
06.05.2015, 19:27 | #9 | |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,709
|
Цитата:
|
|
07.05.2015, 08:05 | #10 |
Пользователь
Регистрация: 05.05.2015
Сообщений: 55
|
Ну вроде понимается. Еще попрактикуюсь - въеду. Всем большое спасибо за помошь!
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
двойной указатель! | Ann3ooo | Помощь студентам | 15 | 28.01.2013 00:13 |
Передать указатель на указатель в функцию | erro | Общие вопросы C/C++ | 3 | 29.10.2012 17:59 |
двойной ping | stupid | C# (си шарп) | 6 | 29.03.2011 11:08 |
Двойной инкримент | Veiron | SQL, базы данных | 5 | 04.06.2010 13:11 |
Двойной запуск | SONce | Общие вопросы Delphi | 4 | 15.04.2009 20:50 |