Поведение при назначении указателя C - PullRequest
0 голосов
/ 21 сентября 2008

temp2, temp1 являются указателями на некоторую структуру x:

struct FunkyStruct x;
struct FunkyStruct *temp1 = &x, *temp2 = &x;

Теперь, после выполнения следующих строк:

temp2=temp1;
temp1=temp1->nxt;

... Будут ли temp2 и temp1 по-прежнему указывать на одну и ту же ячейку памяти? Если нет, пожалуйста, объясните, почему они будут другими.

Ответы [ 8 ]

10 голосов
/ 21 сентября 2008

Первоначально temp1 и temp2 оба содержат адрес памяти x.

temp2 = temp1 означает «присвоить значение от temp1 до temp2». Поскольку они имеют одинаковое значение для начала, эта команда ничего не делает.

Выражение temp1->next означает «Заглянуть внутрь структуры данных, на которую указывает temp1, и вернуть значение поля next». Так temp1 = temp1->next присваивает значение temp1->next temp1. (Конечно, поиск происходит до назначения.) temp1 теперь будет содержать любое значение, которое было в поле next. Это может быть то же самое, что и старое значение, или оно может быть другим.

7 голосов
/ 21 сентября 2008

Это звучит как вопрос, основанный на фоне в Java?

Ответ, который дал dysfunctor , хорош.

Важно понимать, что в C назначение указателя ничем не отличается от назначения целого числа.

Рассмотрим следующую модификацию вашего исходного кода:

 int temp1 = 1;
 int temp2;
 temp2=temp1;
 temp1=temp1 + 1;

В конце этого значения temp1 равно 2, temp2 равно 1.

Это не то же самое, что присваивать (не примитивный) объект в Java, где присваивание фактически назначает ссылку на объект, а не на значение.

2 голосов
/ 21 сентября 2008

temp2 не будет обновляться, но temp1 будет указывать на следующий элемент. Поэтому, если temp1 равно 0x89abcdef, а temp1-> next равно 0x89b00000, то после того, как вы закончите, temp1 будет 0x89b00000 и temp2 будет 0x89abcdef.

Если, конечно, вы создаете связанный список.

1 голос
/ 21 сентября 2008

Нет, если предположить, что есть указатели, подобные C. C. temp2 будет указывать на местоположение x, а temp1 будет указывать на то, на что указывает указатель nxt. Обычно это макет односвязного списка.

1 голос
/ 21 сентября 2008

Different.

Вы сохранили адрес того, на что изначально был указан temp1, в temp2. Затем вы изменили то, на что указывает temp1, а не переменную на другом конце того, на что указывает temp1.

Если бы вы сделали

temp2 = temp1;
*temp1 = temp1->foo;

тогда temp1 и temp2 будут указывать на (одну и ту же) измененную переменную.

1 голос
/ 21 сентября 2008

Вы не даете нам достаточно информации, чтобы ответить на ваш вопрос. Они начинают указывать на одну и ту же структуру, или они оба имеют указатель типа на структуру x? И если это какая-то структура x, каково определение поля nxt?

0 голосов
/ 21 сентября 2008

Короткий ответ - нет. Но только если nxt отличается от temp1 и temp2 для начала.

Строка temp1 = temp1-> nxt; состоит из двух частей, разделенных оператором = . Это:

  • Правая часть temp1-> nxt ищет структуру, указанную temp1 , и принимает значение переменной nxt . Это указатель (новая ячейка памяти).
  • Указатель с правой стороны затем используется для обновления значения temp1 .
0 голосов
/ 21 сентября 2008

x (и, следовательно, x.nxt) будут инициализированы неопределенным значением, в зависимости от комбинации компилятора, параметров компилятора и среды выполнения. temp1 и temp2 оба будут указывать на x (до и после temp1 = temp2). Тогда temp1 будет присвоено любое значение x.nxt.

Окончательный ответ: 0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...