LINUX.ORG.RU

История изменений

Исправление Vic, (текущая версия) :

dup, не смотри на сообщение об ошибке которое у автора в вопросе.

Суть вопроса автора вот в чем.

char test = 'a';
char *ptr_to_char = &test;
Автор вопроса спрашивает, почему отличается синтаксис (1) и (2) и почему в варианте (2) нет звездочки. Понятное дело, что автор немного в звездочках запутался.
*ptr_to_char = 'b'; // (1)
write(1, ptr_to_char, 1); // (2)

Си, когда генерирует машинный код, «видит» это так:

<адрес переменной> = <источник значение переменной/константы>; // (1)
write(<источник значения переменной/константы>, <источник значения переменной/константы>, <источник значения переменной/константы>); // (2)

// Что бы добраться до значений в "<значение переменной/константы>", компилятор вставляет код чтения значения из переменной/константы, которую ты указал как источник значения в строке с write().
В то же самое время, в исходнике, ты должен во write() помещать сами переменные, а значения из них будет доставать сгенерированный компилятором код, в зависимости от того, где компилятор ранее разместил исходные переменные (в памяти, на стеке текущей функции (где стоит вызов write() или в регистре процессора).

PS.

Значение переменной может передаваться в функцию и через регистр (число, адрес)-> на стеке не будет никаких выделений. В обще это должно зависеть от опций оптимизаций с которыми был собран бинарь и от типа самих данных конечно же.

Не важно где компилятор выделил память под копию переменной - в стеке или в регистре. Я лишь заострил внимание, что в функцию попадет копия переменной (или константы), а не сама исходная переменная (или константа). Т.е. внутри функции ты будешь работать с новой переменной (на стеке или в регистре), значение которой было скопировано из исходной переменной, поданной на вход функции, до вызова первой команды внутри функции.

Если я правильно помню, то в С++ эту оплошность исправили и в функцию стало можно передавать саму переменную (ее адрес для генерации когда функции), прикрутив это костылями к понятию «ссылка».

PPS.

Заранее прошу прощения, если в попытках объяснить запутал вас еще больше. Что бы понять это вот всё, так, что бы не осталось вопросов и никто не смог тебя обмануть, стоит смотреть как код выглядит хотя бы в ассемблерном виде (или в машинных кодах, но это сложнее).

Исправление Vic, :

dup, не смотри на сообщение об ошибке которое у автора в вопросе.

Суть вопроса автора вот в чем.

char test = 'a';
char *ptr_to_char = &test;
Автор вопроса спрашивает, почему отличается синтаксис (1) и (2) и почему в варианте (2) нет звездочки. Понятное дело, что автор немного в звездочках запутался.
*ptr_to_char = 'b'; // (1)
write(1, ptr_to_char, 1); // (2)

Си, когда генерирует машинный код, «видит» это так:

<адрес переменной> = <источник значение переменной/константы>; // (1)
write(<источник значения переменной/константы>, <источник значения переменной/константы>, <источник значения переменной/константы>); // (2)

// Что бы добраться до значений в "<значение переменной/константы>", компилятор вставляет код чтения значения из переменной/константы, которую ты указал как источник значения в строке с write().
В то же самое время, в исходнике, ты должен во write() помещать сами переменные, а значения из них будет доставать сгенерированный компилятором код, в зависимости от того, где компилятор ранее разместил исходные переменные (в памяти, на стеке текущей функции (где стоит вызов write() или в регистре процессора).

PS.

Значение переменной может передаваться в функцию и через регистр (число, адрес)-> на стеке не будет никаких выделений. В обще это должно зависеть от опций оптимизаций с которыми был собран бинарь и от типа самих данных конечно же.

Не важно где компилятор выделил память под копию переменной - в стеке или в регистре. Я лишь заострил внимание, что в функцию попадет копия переменной (или константы), а не сама исходная переменная (или константа). Т.е. внутри функции ты будешь работать с новой переменной (на стеке или в регистре), значение которой было скопировано из исходной переменной, поданной на вход функции, до вызова первой команды внутри функции.

Если я правильно помню, то в С++ эту оплошность исправили и в функцию стало можно передавать саму переменную (ее адрес для генерации когда функции), прикрутили это к понятию «ссылка».

PPS.

Заранее прошу прощения, если в попытках объяснить запутал вас еще больше. Что бы понять это вот всё, так, что бы не осталось вопросов и никто не смог тебя обмануть, стоит смотреть как код выглядит хотя бы в ассемблерном виде (или в машинных кодах, но это сложнее).

Исправление Vic, :

dup, не смотри на сообщение об ошибке которое у автора в вопросе.

Суть вопроса автора вот в чем.

char test = 'a';
char *ptr_to_char = &test;
Автор вопроса спрашивает, почему отличается синтаксис (1) и (2) и почему в варианте (2) нет звездочки. Понятное дело, что автор немного в звездочках запутался.
*ptr_to_char = 'b'; // (1)
write(1, ptr_to_char, 1); // (2)

Си, когда генерирует машинный код, «видит» это так:

<адрес переменной> = <источник значение переменной/константы>; // (1)
write(<источник значения переменной/константы>, <источник значения переменной/константы>, <источник значения переменной/константы>); // (2)

// Что бы добраться до значений в "<значение переменной/константы>", компилятор вставляет код чтения значения из переменной/константы, которую ты указал как источник значения в строке с write().
В то же самое время, в исходнике, ты должен во write() помещать сами переменные, а значения из них будет доставать сгенерированный компилятором код.

PS.

Значение переменной может передаваться в функцию и через регистр (число, адрес)-> на стеке не будет никаких выделений. В обще это должно зависеть от опций оптимизаций с которыми был собран бинарь и от типа самих данных конечно же.

Не важно где компилятор выделил память под копию переменной - в стеке или в регистре. Я лишь заострил внимание, что в функцию попадет копия переменной (или константы), а не сама исходная переменная (или константа). Т.е. внутри функции ты будешь работать с новой переменной (на стеке или в регистре), значение которой было скопировано из исходной переменной, поданной на вход функции, до вызова первой команды внутри функции.

Если я правильно помню, то в С++ эту оплошность исправили и в функцию стало можно передавать саму переменную (ее адрес для генерации когда функции), прикрутили это к понятию «ссылка».

PPS.

Заранее прошу прощения, если в попытках объяснить запутал вас еще больше. Что бы понять это вот всё, так, что бы не осталось вопросов и никто не смог тебя обмануть, стоит смотреть как код выглядит хотя бы в ассемблерном виде (или в машинных кодах, но это сложнее).

Исправление Vic, :

dup, не смотри на сообщение об ошибке которое у автора в вопросе.

Суть вопроса автора вот в чем.

char test = 'a';
char *ptr_to_char = &test;
Автор вопроса спрашивает, почему отличается синтаксис (1) и (2) и почему в варианте (2) нет звездочки. Понятное дело, что автор немного в звездочках запутался.
*ptr_to_char = 'b'; // (1)
write(1, ptr_to_char, 1); // (2)

Си, когда генерирует машинный код, «видит» это так:

<адрес переменной> = <источник значение переменной/константы>; // (1)
write(<источник значения переменной/константы>, <источник значения переменной/константы>, <источник значения переменной/константы>); // (2)

// Что бы добраться до значений в "<значение переменной/константы>", компилятор вставляет код чтения значения из переменной/константы, которую ты указал как источник значения в строке с write().
В то же самое время, в исходнике, ты должен во write() помещать сами переменные, а значения из них будет доставать сгенерированный компилятором код.

PS.

Значение переменной может передаваться в функцию и через регистр (число, адрес)-> на стеке не будет никаких выделений. В обще это должно зависеть от опций оптимизаций с которыми был собран бинарь и от типа самих данных конечно же.

Не важно где компилятор выделил память под копию переменной - в стеке или в регистре. Я лишь заострил внимание, что в функцию будет копия переменной (или константы), а не сама исходная переменная (или константа). Т.е. внутри функции ты будешь работать с новой переменной (на стеке или в регистре), значение которой было скопировано из исходной переменной, поданной на вход функции, до вызова первой команды внутри функции.

Если я правильно помню, то в С++ эту оплошность исправили и в функцию стало можно передавать саму переменную (ее адрес для генерации когда функции), прикрутили это к понятию «ссылка».

PPS.

Заранее прошу прощения, если в попытках объяснить запутал вас еще больше. Что бы понять это вот всё, так, что бы не осталось вопросов и никто не смог тебя обмануть, стоит смотреть как код выглядит хотя бы в ассемблерном виде (или в машинных кодах, но это сложнее).

Исправление Vic, :

dup, не смотри на сообщение об ошибке которое у автора в вопросе.

Суть вопроса автора вот в чем.

char test = 'a';
char *ptr_to_char = &test;
Автор вопроса спрашивает, почему отличается синтаксис (1) и (2) и почему в варианте (2) нет звездочки. Понятное дело, что автор немного в звездочках запутался.
*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;
Автор вопроса спрашивает, почему отличается синтаксис (1) и (2) и почему в варианте (2) нет звездочки. Понятное дело, что автор немного в звездочках запутался.
*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;
Автор вопроса спрашивает, почему отличается синтаксис (1) и (2) и почему в варианте (2) нет звездочки. Понятное дело, что автор немного в звездочках запутался.
*ptr_to_char = 'b'; // (1)
write(1, ptr_to_char, 1); // (2)

PS.

Значение переменной может передаваться в функцию и через регистр (число, адрес)-> на стеке не будет никаких выделений. В обще это должно зависеть от опций оптимизаций с которыми был собран бинарь и от типа самих данных конечно же.

Не важно где компилятор выделил память под копию переменной - в стеке или в регистре. Я лишь заострил внимание, что в функцию будет копия переменной (или константы), а не сама исходная переменная (или константа). Т.е. внутри функции ты будешь работать с новой переменной (на стеке или в регистре), значение которой было скопировано из исходной переменной, поданной на вход функции, до вызова первой команды внутри функции.

Если я правильно помню, то в С++ эту оплошность исправили и в функцию стало можно передавать саму переменную (ее адрес для генерации когда функции), прикрутили это к понятию «ссылка».