Адреса и указатели в Си. Адресная арифметика. Передача адреса переменной в функцию.

  Переглядів 3,904

Олег Волков

Олег Волков

День тому

Друзья, всем привет)
Долго мы топали к этой теме и наконец-то добрались.
Тема явно не для начинающих, она сложная, но очень важная.
В данном видео я только частично задел тему адресов и указателей в Си, но для понятия основ этого уже достаточно.
00:00 Введение
00:24 Адреса и указатели в Си
07:17 Массивы и адресная арифметика
28:35 Передача адреса переменной в функцию.
Мой GitHub: github.com/Solderingironspb/L...
Мы в контакте: solderingiron.stm32
ЯндексДзен: zen.yandex.ru/id/622208eed2eb...
Текстовый вариант занятия: github.com/Solderingironspb/L...

КОМЕНТАРІ: 15
@masterkit9517
@masterkit9517 2 роки тому
Как долго я ждал этот урок и хоть кто нибудь это расскажет. Супер! С Новым годом!
@user-je8oz6lh6w
@user-je8oz6lh6w 2 роки тому
Классное видео и полезное. Сам немного в этой теме плаваю т.к. изначально я паскальщик. Единственно, что резануло слух - это слово "наоборот". На самом деле надо бы пояснить, что многобайтные переменные хранятся в памяти от младшего байта к старшему с возрастанием адреса. С НОВЫМ ГОДОМ !!!
@user-sj3ix8zp3w
@user-sj3ix8zp3w 2 роки тому
Ждём ещё видео!
@PastuhMedvedey
@PastuhMedvedey 2 роки тому
Понравилось видео, спасибо!
@allallall2321
@allallall2321 2 роки тому
Спасибо
@Akadem_birds
@Akadem_birds 2 роки тому
Почему printf странно выводит "pi convertion" в виде "i convertion"? Куда пропадает "p"? И result читается как "резалт" :) А за урок спасибо, интересно было понять логику работы адресов и указателей.
@Solderingironspb
@Solderingironspb 2 роки тому
Вы меня тут будете английскому произношению учить?) В CubeIDE, при входе в дебаг, почти всегда самый первый символ, выведенный в printf пропадает. Поэтому если очень хочется, то перед выводом можно вставить пробел тот же, но я таким обычно не занимаюсь, т.к. привык к этому)
@OpenFrimeTVcom
@OpenFrimeTVcom 2 роки тому
спасибо за урок. я недавно столкнулся с следующим, необходимо было вывести double значение в юарт. но оно ведь 32битное. как это сделать, решаю создать переменную указатель на ячейку памяти, и потом по 8 бит вывести в юарт. то есть беру указатель итерирую его и вывожу в юарт. (у меня контроллер авр) так вот, когда я создал указатель на double, то он указывал фиг знает куда. просто в рандомную область памяти. А вот когда я его переопределил, ptr = (uint8_t *) &var1; только тогда начало указывать на нужный адрес. Не знаете из за чего так происходило?
@Solderingironspb
@Solderingironspb 2 роки тому
по поводу AVR может гляну чуть попозже, если arduino nano найду. Но если смотреть на Stm32, то я вот так с double попробовал: float pi_float = 3.14159f; double pi_double = 3.14159; uint8_t size = 0; uint32_t pi_32bits = 0; uint64_t pi_64bits = 0; size = sizeof(pi_float); //узнаем размер float printf("float size = %d bytes ", size); size = sizeof(pi_double); //узнаем размер double printf("double size = %d bytes ", size); //Соответственно видим, что double 64 бита(8 байт). //float весит 32 бита(4 байта) //Преобразуем float в uint32_t: pi_32bits = *(uint32_t*) &pi_float; printf("float in hex = 0x%lX ", pi_32bits); //Преобразуем double в uint64_t: pi_64bits = *(uint64_t*) &pi_double; printf("double in hex = 0x%lX%lX ", *((uint32_t*)&pi_64bits+1), *(uint32_t*)&pi_64bits); //я хз как 64 бита выводить в консоль, поэтому поделил по 32 бита и вывел) uint8_t Array[8] = {0,}; //Разобьем pi_double на 8 частей по 8 байт: for(uint8_t i = 0; i < 8; i++){ *((uint8_t*)Array+i) = *((uint8_t*)&pi_double + (7-i)); printf("Data %d = %.2X ", i, Array[i]); } Что выдала консоль: float size = 4 bytes double size = 8 bytes float in hex = 0x40490FD0 double in hex = 0x400921F9F01B866E Data 0 = 40 Data 1 = 09 Data 2 = 21 Data 3 = F9 Data 4 = F0 Data 5 = 1B Data 6 = 86 Data 7 = 6E
@OpenFrimeTVcom
@OpenFrimeTVcom 2 роки тому
@@Solderingironspb спасибо за такой подробный ответ. Для меня послужит хорошим примером. ( я еще плавая в теме, теперь есть повод разобраться)
@Solderingironspb
@Solderingironspb 2 роки тому
Добрался я до Arduino nano. Ситуация следующая(отличается от Stm32). Тут, как я понимаю, использовать double смысла нет. Будет как float. Прилагаю код и вывод в консоль: #include #include #include float pi_float = 3.14159f; double pi_double = 3.14159; uint8_t size = 0; uint32_t pi_32bits = 0; uint64_t pi_64bits = 0; char tx_buffer[64] = {0,}; int main(void) { init(); Serial.begin(115200); size = sizeof(pi_float); //узнаем размер float sprintf(tx_buffer, "float size = %d bytes ", size); Serial.write(tx_buffer, strlen(tx_buffer)); size = sizeof(pi_double); //узнаем размер double sprintf(tx_buffer, "double size = %d bytes ", size); Serial.write(tx_buffer, strlen(tx_buffer)); //Соответственно видим, что double 32 бита(4 байта). //float весит 32 бита(4 байта) //Преобразуем float в uint32_t: pi_32bits = *(uint32_t*) &pi_float; sprintf(tx_buffer, "float in hex = 0x%lX ", pi_32bits); Serial.write(tx_buffer, strlen(tx_buffer)); //Преобразуем double в uint64_t: pi_64bits = *(uint64_t*) &pi_double; sprintf(tx_buffer, "double in hex = 0x%lX ", *((uint32_t*)&pi_64bits)); Serial.write(tx_buffer, strlen(tx_buffer)); uint8_t Array[4] = {0,}; //Разобьем pi_double на 4 части по 8 байт: for (uint8_t i = 0; i < 4; i++) { *((uint8_t*)Array + i) = *((uint8_t*)&pi_double + (3 - i)); sprintf(tx_buffer, "Data %d = %.2X ", i, Array[i]); Serial.write(tx_buffer, strlen(tx_buffer)); } while (1) { } } _______________________________________________________________________ Что выдала консоль: float size = 4 bytes double size = 4 bytes float in hex = 0x40490FD0 double in hex = 0x40490FD0 Data 0 = 40 Data 1 = 49 Data 2 = 0F Data 3 = D0
@OpenFrimeTVcom
@OpenFrimeTVcom 2 роки тому
@@Solderingironspb оо, спасибо большое за ваш труд)
@Selfrock_Vladimir
@Selfrock_Vladimir Рік тому
Лет пятнадцать назад, если бы мне сказали что, для демонстрации простых примеров кода на С, кто то будет каждый раз перепрошивать микроконтроллер, я бы покрутил пальцем у виска, а сейчас уже вроде норм...
@Solderingironspb
@Solderingironspb Рік тому
А что тут такого? Работаем с МК, соответственно и работу на МК показываю.
@Selfrock_Vladimir
@Selfrock_Vladimir Рік тому
@@Solderingironspb Сейчас уже ничего такого. Но были времена, когда количество возможностей прошивки контроллера были сильно ограничены. В некоторых вариантах контроллер можно было прошивать строго один раз, первый и последний, а для новой прошивки покупать новый контроллер.
Адреса и указатели в Си. Адресная арифметика
27:47
Тимофей Хирьянов
Переглядів 158 тис.
EEPROM AT24Cxx. Подключаем к STM32. CRC32.
27:09
Олег Волков
Переглядів 7 тис.
0% Respect Moments 😥
00:27
LE FOOT EN VIDÉO
Переглядів 30 млн
Помилка,  яку зробило військове керівництво 🙄
01:00
Радіо Байрактар
Переглядів 348 тис.
Зомби Апокалипсис  часть 1 🤯#shorts
00:29
INNA SERG
Переглядів 3,5 млн
First program structure in C++ with best concept
8:19
Daily Dose
Переглядів 4
Visual Studio + VisualGDB + STM32. Обзор. Пробный проект.
29:38
Олег Волков
Переглядів 8 тис.
Visual Studio + VisualGDB + STM32. Пробуем Китайские STM32.
4:56
Олег Волков
Переглядів 3,7 тис.
Попаболь  - поддельные STM32
7:51
Скифовский
Переглядів 42 тис.
КУПИЛ SAMSUNG GALAXY S24 ULTRA ЗА 88000 РУБЛЕЙ!
27:29
DimaViper
Переглядів 50 тис.
🤯Самая КРУТАЯ Функция #shorts
0:58
YOLODROID
Переглядів 2 млн
ЭТОТ МОНСТР ОТ INFINIX КРУЧЕ ЛЮБОГО XIAOMI! Я в шоке…
13:01
Thebox - о технике и гаджетах
Переглядів 24 тис.
It's embarrassing how much I like this thing.
12:19
Linus Tech Tips
Переглядів 878 тис.