Как работает данный код

Вы свои желания неправильно поняли.

Вы записали литерал (если не знаете, что это такое - погуглите) “00” и почему-то изъявили желание его изменять.

Вот, скажите, у Вас не возникает желания изменять числовые литералы? Ну например, изменить литеарл 5 так, чтобы везде, где Вы потом будете использовать этот литерал (например, в записи a=5; реально фигурировало не 5, а, скажем, 321? Нет? Не возникает? А почему с литералом “00” возникло? В чём разница?

Кстати

В языке Fortran IV была возможность просто и элегантно изменять числовые литералы. Представляете, какое веселье было искать ляпы подобных Вам “программистов” :slight_smile:

Да, это предложил я. И что, вы сделали? - не вижу такого в вашем коде

ВОТ! Если это так тогда все ставновитс я понятно… Я понял что =“000” ложится строка из символов и указателю присваивается адрес.
Правда зачем тогда “000” а не просто “0” ибо если это адрес то 0 или 00 или 000 одно и тоже…

Нет, второй и третий на 1 больше первого. У строк общие хвосты.

смысла этих слов я не понимаю. но судя по вашем выводам вы снова ничего не поняли.

D:\arduino-1.8.19\portable\sketchbook\sketch_nov16b\sketch_nov16b.ino:1:12: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
char* TBuf=“000”;
^~~~~
D:\arduino-1.8.19\portable\sketchbook\sketch_nov16b\sketch_nov16b.ino:2:12: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
char* MBuf=“00”;
^~~~
D:\arduino-1.8.19\portable\sketchbook\sketch_nov16b\sketch_nov16b.ino:3:12: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
char* SBuf=“00”;
^~~~

Да, конечно , тут MBuf и SBuf будут указывать на TBuf+1, это я уже упростил.
ТС и так-то ничего не понял…

@romansochi, вот я Вас ещё утром спросил про эти указатели: “Вы из печатали?”

Неужели, у Вас с тех пор, так и не возникло желания их напечатать? Так Вы никогда и ничему не научитесь!

Смотрите:

#include <Printing.h>

void setup() {
	Serial.begin(57600);
	char * yin = const_cast<char *>("00");
	char * yang = const_cast<char *>("00");
	char * dao =  const_cast<char *>("000");
	printf("yin=%p\r\nyang=%p\r\ndao=%p\r\n", yin, yang, dao);
}
void loop (void) {}
//
//	Результат:
//	yin=0x119
//	yang=0x119
//	dao=0x118

Хрень какая-то с форматированием. Попробую браузер перезапустить

конкретно до фортрана не добрался , но я понимаю о чем Вы.

@romansochi
Вернемся к коду.
Исправьте свои строчки ПРАВИЛЬНО и попробуйте - заработает или нет.
Исправленный код - в форум. ПОЛНОСТЬЮ, а не три строки.

ЭЭЭЭ?:slight_smile: увлешись разбором кода я не подумал что Вы говорите буквально - распечатай …
теперь вроде понятно…

@ЕвгенийП может это устаревшее, но спрошу.

C++03, 2.13.4 String literals:

  1. A string literal is a sequence of characters (as defined in 2.13.2) surrounded
    by double quotes, optionally beginning with the letter L, as in “…” or L"…“.
    A string literal that does not begin with L is an ordinary string literal, also
    referred to as a narrow string literal. An ordinary string literal has type "array of n
    const char" and static storage duration (3.7), where n is the size of the string as
    defined below, and is initialized with the given characters. A string literal that
    begins with L, such as L"asdf”, is a wide string literal. A wide string literal has
    type “array of n const wchar_t”
    and has static storage duration, where n is the size
    of the string as defined below, and is initialized with the given characters.

Почему можно изменить const char ?

Не понял вопроса.

???
Почему в массиве констант мы можем изменить одну из них?

@kolyn в какой фразе приведенного вами текста вы видите указание на то, что текст можно изменить?

Пример @WladDrakula
char * a = "1111"; a[1] = '2'; работает. Мы ведь изменяем литерал (константный)?

Вообще-то не можем.

Для этого надо явно преобразовать указатель из const char * в char * (что и сделал ТС), а это уже говнокод. Иногда это приходится делать по разным причинам, но при этом надо чётко понимать, что делаешь.

У меня про это было небольшое эссе на старом форуме … нашёл. Попробуйте запустить этот код на Uno/Nano и посмотрите, что напечатается в строке №8

void awfulShitCode(const char * s)  {
	*((long*)s+1)=1702125896l;
}

void setup(void) {
	Serial.begin(115200);
	awfulShitCode("Oh!");
	Serial.println("Love you!");
}

void loop(void) {}

Интересно, а этот фокус с литералами, которые хвостами делятся друг с другом, прокатывает с PROGMEM или нет…

Долго ли проверить?

#include <Printing.h>

void setup() {
	Serial.begin(57600);

	const __FlashStringHelper * yin = F("00");
	const __FlashStringHelper * yang = F("00");
	const __FlashStringHelper * dao =  F("000");

	printf("yin=%p\r\nyang=%p\r\ndao=%p\r\n", yin, yang, dao);
}

void loop (void) {}

//	Результат:
//	yin=0x6f
//	yang=0x6c
//	dao=0x68

Неконстантный указатель на константу не криминал, верно? Но почему компилятор не считает ошибкой изменение константы, как в примере @WladDrakula ?