указатели в аргументе, амперсанд? - PullRequest
1 голос
/ 15 октября 2019

Я передаю указатель на функцию, я могу получить доступ к членам структуры из указателя.

В этой функции мне нужно вызвать другую функцию с таким же указателем в качестве аргумента. Я использую амперсанд, но приложение остановлено.

Как вызвать другую функцию () из myfunction ()?

bool anotherfunction( const ovrVkGraphicsPipelineParms * parms )
{
    myStruct info;
    info.layout = parms->program->parmLayout.pipelineLayout; // application error
}

bool myfunction( const ovrVkGraphicsPipelineParms * parms )
{
    myStruct info;
    info.layout = parms->program->parmLayout.pipelineLayout; // Works

    anotherfunction( &parms ); // compile, but application stopped
}

void main()
{
    myfunction( &pipelineParms );
}

Ответы [ 2 ]

6 голосов
/ 15 октября 2019

В 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, что также неправильно, хотя это не вызывает у вас никаких проблем.)

0 голосов
/ 15 октября 2019
anotherfunction( &parms ); // compile, but application stopped

У вас уже есть parms в качестве указателя, вам не нужно &.

anotherfunction( parms ); // compile, but application stopped

Если вы добавите & к parms, оно станет onst ovrVkGraphicsPipelineParms **

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