В C символ &
перед переменной не означает «эта вещь является указателем». Нет, когда вы ставите &
перед переменной, это означает «сделайте мне указатель на это».
Поэтому, когда вы вызываете
myfunction(&pipelineParms);
, у вас есть переменная pipelineParms
,и вы создали указатель на него, и именно этот указатель вы передали myfunction
.
Затем, в myfunction
, parms
был указателем (в частности, указатель на тип ovrVkGraphicsPipelineParms
. Надеемся, что pipelineParms
в main
также было типа ovrVkGraphicsPipelineParms
.)
Так что в myfunction
, если вы хотите передать указатель на anotherfunction
, просто передайте его:
anotherfunction(parms);
Мы можем видеть, что anotherfunction
также принимает указатель на тип ovrVkGraphicsPipelineParms
, так что это правильно.
Когда вы пытались вызвать anotherfunction(&parms)
, &
сказал: "makeмне указатель на это ". Таким образом, вы получили указатель на указатель на тип ovrVkGraphicsPipelineParms
или ovrVkGraphicsPipelineParms **
. Это может быть хорошо, если это то, что ожидает anotherfunction
, но это не так.
Дело не в том, что C имеет регулярные переменные и указатели на обычные переменные. Вы можете иметь указатели на что угодно . У вас могут быть указатели на указатели и указатели на указатели на указатели, и теоретически вы можете иметь указатели на 4, 5 и 6 уровней, вплоть до 12 или более (хотя на практике что-либо за пределами 3 встречается крайне редко. ).
Еще одна вещь: вы сказали
anotherfunction( &parms ); // compile, but application stopped
, но я предполагаю, что на самом деле он не скомпилировался должным образом. Я предполагаю, что ваш компилятор дал вам предупреждение. Мой пишет:
предупреждение: несовместимые типы указателей передают 'const ovrVkGraphicsPipelineParms **' параметру типа 'const ovrVkGraphicsPipelineParms *';remove &
Если ваш компилятор не выдал вам предупреждение в этой строке, я рекомендую вам переключиться на лучший компилятор, если это возможно. (Современный компилятор также предупредит вас о void main
, что также неправильно, хотя это не вызывает у вас никаких проблем.)