Для вопроса 1 метод 1 берет адрес переменной l
. l
инициализируется для хранения копии значения i
элемента массива. Это совершенно другое место в памяти. Обратите внимание, что если функция removeFirstElement()
зависит от аргумента, являющегося указателем на массив, она с треском провалится, используя метод 1.
Для вопроса 2 строка 2 действительна, но не по той причине, о которой вы, вероятно, думаете. То, что он оценивает, получает адрес
struct1.ptr1->ptr2->someIntValue
. Обратите внимание, что вы взяли не адрес структуры, а член члена, на который он указывал. Вы, вероятно, хотели, чтобы это было так:
(&struct1).ptr1->ptr2->someIntValue
Это с треском провалится.
Оператор доступа к члену (.
) используется в значениях структуры для доступа к члену. На LHS у вас есть указатель на структуру, и он должен использовать оператор стрелки (->
) для доступа к члену. Или, разыменуйте указатель сначала, затем используйте точку (чему эквивалентен оператор стрелки).
(*(&struct1)).ptr1
/* is equivalent to: */
(&struct1)->ptr1
Что касается вопроса 3, предположим, что
ptr1
и
ptr2
являются указателями на то, на что указывает структура
ptrToStruct
, тогда да,
ptr1
все еще указывает на то, на что оно указывает. Вы никогда не изменяли переменную
ptr1
, только структуру, на которую она указывала. Поскольку и
ptr1
, и
ptr2
указывают на одну и ту же структуру (другими словами, с псевдонимом), при доступе к элементу
ptr1->intProp
. вы должны увидеть одно и то же значение.