История изменений
Исправление Vic, (текущая версия) :
dup, не смотри на сообщение об ошибке которое у автора в вопросе.
Суть вопроса автора вот в чем.
char test = 'a';
char *ptr_to_char = &test;
*ptr_to_char = 'b'; // (1)
write(1, ptr_to_char, 1); // (2)
Си, когда генерирует машинный код, «видит» это так:
<адрес переменной> = <источник значение переменной/константы>; // (1)
write(<источник значения переменной/константы>, <источник значения переменной/константы>, <источник значения переменной/константы>); // (2)
// Что бы добраться до значений в "<значение переменной/константы>", компилятор вставляет код чтения значения из переменной/константы, которую ты указал как источник значения в строке с write().
PS.
Значение переменной может передаваться в функцию и через регистр (число, адрес)-> на стеке не будет никаких выделений. В обще это должно зависеть от опций оптимизаций с которыми был собран бинарь и от типа самих данных конечно же.
Не важно где компилятор выделил память под копию переменной - в стеке или в регистре. Я лишь заострил внимание, что в функцию попадет копия переменной (или константы), а не сама исходная переменная (или константа). Т.е. внутри функции ты будешь работать с новой переменной (на стеке или в регистре), значение которой было скопировано из исходной переменной, поданной на вход функции, до вызова первой команды внутри функции.
Если я правильно помню, то в С++ эту оплошность исправили и в функцию стало можно передавать саму переменную (ее адрес для генерации когда функции), прикрутив это костылями к понятию «ссылка».
PPS.
Заранее прошу прощения, если в попытках объяснить запутал вас еще больше. Что бы понять это вот всё, так, что бы не осталось вопросов и никто не смог тебя обмануть, стоит смотреть как код выглядит хотя бы в ассемблерном виде (или в машинных кодах, но это сложнее).
Исправление Vic, :
dup, не смотри на сообщение об ошибке которое у автора в вопросе.
Суть вопроса автора вот в чем.
char test = 'a';
char *ptr_to_char = &test;
*ptr_to_char = 'b'; // (1)
write(1, ptr_to_char, 1); // (2)
Си, когда генерирует машинный код, «видит» это так:
<адрес переменной> = <источник значение переменной/константы>; // (1)
write(<источник значения переменной/константы>, <источник значения переменной/константы>, <источник значения переменной/константы>); // (2)
// Что бы добраться до значений в "<значение переменной/константы>", компилятор вставляет код чтения значения из переменной/константы, которую ты указал как источник значения в строке с write().
PS.
Значение переменной может передаваться в функцию и через регистр (число, адрес)-> на стеке не будет никаких выделений. В обще это должно зависеть от опций оптимизаций с которыми был собран бинарь и от типа самих данных конечно же.
Не важно где компилятор выделил память под копию переменной - в стеке или в регистре. Я лишь заострил внимание, что в функцию попадет копия переменной (или константы), а не сама исходная переменная (или константа). Т.е. внутри функции ты будешь работать с новой переменной (на стеке или в регистре), значение которой было скопировано из исходной переменной, поданной на вход функции, до вызова первой команды внутри функции.
Если я правильно помню, то в С++ эту оплошность исправили и в функцию стало можно передавать саму переменную (ее адрес для генерации когда функции), прикрутили это к понятию «ссылка».
PPS.
Заранее прошу прощения, если в попытках объяснить запутал вас еще больше. Что бы понять это вот всё, так, что бы не осталось вопросов и никто не смог тебя обмануть, стоит смотреть как код выглядит хотя бы в ассемблерном виде (или в машинных кодах, но это сложнее).
Исправление Vic, :
dup, не смотри на сообщение об ошибке которое у автора в вопросе.
Суть вопроса автора вот в чем.
char test = 'a';
char *ptr_to_char = &test;
*ptr_to_char = 'b'; // (1)
write(1, ptr_to_char, 1); // (2)
Си, когда генерирует машинный код, «видит» это так:
<адрес переменной> = <источник значение переменной/константы>; // (1)
write(<источник значения переменной/константы>, <источник значения переменной/константы>, <источник значения переменной/константы>); // (2)
// Что бы добраться до значений в "<значение переменной/константы>", компилятор вставляет код чтения значения из переменной/константы, которую ты указал как источник значения в строке с write().
PS.
Значение переменной может передаваться в функцию и через регистр (число, адрес)-> на стеке не будет никаких выделений. В обще это должно зависеть от опций оптимизаций с которыми был собран бинарь и от типа самих данных конечно же.
Не важно где компилятор выделил память под копию переменной - в стеке или в регистре. Я лишь заострил внимание, что в функцию попадет копия переменной (или константы), а не сама исходная переменная (или константа). Т.е. внутри функции ты будешь работать с новой переменной (на стеке или в регистре), значение которой было скопировано из исходной переменной, поданной на вход функции, до вызова первой команды внутри функции.
Если я правильно помню, то в С++ эту оплошность исправили и в функцию стало можно передавать саму переменную (ее адрес для генерации когда функции), прикрутили это к понятию «ссылка».
PPS.
Заранее прошу прощения, если в попытках объяснить запутал вас еще больше. Что бы понять это вот всё, так, что бы не осталось вопросов и никто не смог тебя обмануть, стоит смотреть как код выглядит хотя бы в ассемблерном виде (или в машинных кодах, но это сложнее).
Исправление Vic, :
dup, не смотри на сообщение об ошибке которое у автора в вопросе.
Суть вопроса автора вот в чем.
char test = 'a';
char *ptr_to_char = &test;
*ptr_to_char = 'b'; // (1)
write(1, ptr_to_char, 1); // (2)
Си, когда генерирует машинный код, «видит» это так:
<адрес переменной> = <источник значение переменной/константы>; // (1)
write(<источник значения переменной/константы>, <источник значения переменной/константы>, <источник значения переменной/константы>); // (2)
// Что бы добраться до значений в "<значение переменной/константы>", компилятор вставляет код чтения значения из переменной/константы, которую ты указал как источник значения в строке с write().
PS.
Значение переменной может передаваться в функцию и через регистр (число, адрес)-> на стеке не будет никаких выделений. В обще это должно зависеть от опций оптимизаций с которыми был собран бинарь и от типа самих данных конечно же.
Не важно где компилятор выделил память под копию переменной - в стеке или в регистре. Я лишь заострил внимание, что в функцию будет копия переменной (или константы), а не сама исходная переменная (или константа). Т.е. внутри функции ты будешь работать с новой переменной (на стеке или в регистре), значение которой было скопировано из исходной переменной, поданной на вход функции, до вызова первой команды внутри функции.
Если я правильно помню, то в С++ эту оплошность исправили и в функцию стало можно передавать саму переменную (ее адрес для генерации когда функции), прикрутили это к понятию «ссылка».
PPS.
Заранее прошу прощения, если в попытках объяснить запутал вас еще больше. Что бы понять это вот всё, так, что бы не осталось вопросов и никто не смог тебя обмануть, стоит смотреть как код выглядит хотя бы в ассемблерном виде (или в машинных кодах, но это сложнее).
Исправление Vic, :
dup, не смотри на сообщение об ошибке которое у автора в вопросе.
Суть вопроса автора вот в чем.
char test = 'a';
char *ptr_to_char = &test;
*ptr_to_char = 'b'; // (1)
write(1, ptr_to_char, 1); // (2)
Си «видит» это так (поэтому и логичная разница в синтаксисе):
<переменная> = <значение переменной/константы>; // (1)
write(<значение переменной/константы>, <значение переменной/константы>, <значение переменной/константы>); // (2)
PS.
Значение переменной может передаваться в функцию и через регистр (число, адрес)-> на стеке не будет никаких выделений. В обще это должно зависеть от опций оптимизаций с которыми был собран бинарь и от типа самих данных конечно же.
Не важно где компилятор выделил память под копию переменной - в стеке или в регистре. Я лишь заострил внимание, что в функцию будет копия переменной (или константы), а не сама исходная переменная (или константа). Т.е. внутри функции ты будешь работать с новой переменной (на стеке или в регистре), значение которой было скопировано из исходной переменной, поданной на вход функции, до вызова первой команды внутри функции.
Если я правильно помню, то в С++ эту оплошность исправили и в функцию стало можно передавать саму переменную (ее адрес для генерации когда функции), прикрутили это к понятию «ссылка».
PPS. Что бы понять это вот всё, так, что бы не осталось вопросов и никто не смог тебя обмануть, стоит смотреть как код выглядит хотя бы в ассемблерном виде (или в машинных кодах, но это сложнее).
Исправление Vic, :
dup, не смотри на сообщение об ошибке которое у автора в вопросе.
Суть вопроса автора вот в чем.
char test = 'a';
char *ptr_to_char = &test;
*ptr_to_char = 'b'; // (1)
write(1, ptr_to_char, 1); // (2)
Си «видит» это так:
<переменная> = 'b'; // (1)
write(<значение>, <значение>, <значение>); // (2)
PS.
Значение переменной может передаваться в функцию и через регистр (число, адрес)-> на стеке не будет никаких выделений. В обще это должно зависеть от опций оптимизаций с которыми был собран бинарь и от типа самих данных конечно же.
Не важно где компилятор выделил память под копию переменной - в стеке или в регистре. Я лишь заострил внимание, что в функцию будет копия переменной (или константы), а не сама исходная переменная (или константа). Т.е. внутри функции ты будешь работать с новой переменной (на стеке или в регистре), значение которой было скопировано из исходной переменной, поданной на вход функции, до вызова первой команды внутри функции.
Если я правильно помню, то в С++ эту оплошность исправили и в функцию стало можно передавать саму переменную (ее адрес для генерации когда функции), прикрутили это к понятию «ссылка».
Исходная версия Vic, :
dup, не смотри на сообщение об ошибке которое у автора в вопросе.
Суть вопроса автора вот в чем.
char test = 'a';
char *ptr_to_char = &test;
*ptr_to_char = 'b'; // (1)
write(1, ptr_to_char, 1); // (2)
PS.
Значение переменной может передаваться в функцию и через регистр (число, адрес)-> на стеке не будет никаких выделений. В обще это должно зависеть от опций оптимизаций с которыми был собран бинарь и от типа самих данных конечно же.
Не важно где компилятор выделил память под копию переменной - в стеке или в регистре. Я лишь заострил внимание, что в функцию будет копия переменной (или константы), а не сама исходная переменная (или константа). Т.е. внутри функции ты будешь работать с новой переменной (на стеке или в регистре), значение которой было скопировано из исходной переменной, поданной на вход функции, до вызова первой команды внутри функции.
Если я правильно помню, то в С++ эту оплошность исправили и в функцию стало можно передавать саму переменную (ее адрес для генерации когда функции), прикрутили это к понятию «ссылка».