Delen via


Argumenten

De argumenten in een functieoproep hebben dit formulier:

expression(expression-listopt) /* Functie-aanroep */

In een functieoproep is expressielijst een lijst met expressies (gescheiden door komma's). De waarden van deze laatste expressies zijn de argumenten die worden doorgegeven aan de functie. Als de functie geen argumenten heeft, moet de expressielijst het trefwoord voidbevatten.

Een argument kan elke waarde zijn met fundamenteel, structuur, samenvoeging of aanwijzertype. Alle argumenten worden doorgegeven door een waarde. Dit betekent dat er een kopie van het argument wordt toegewezen aan de bijbehorende parameter. De functie weet niet de werkelijke geheugenlocatie van het argument dat is doorgegeven. De functie gebruikt deze kopie zonder dat dit van invloed is op de variabele waaruit deze oorspronkelijk is afgeleid.

Hoewel u matrices of functies niet als argumenten kunt doorgeven, kunt u aanwijzers doorgeven aan deze items. Aanwijzers bieden een manier voor een functie om toegang te krijgen tot een waarde op basis van verwijzing. Omdat een aanwijzer naar een variabele het adres van de variabele bevat, kan de functie dit adres gebruiken om toegang te krijgen tot de waarde van de variabele. Met aanwijzerargumenten kan een functie toegang krijgen tot matrices en functies, ook al kunnen matrices en functies niet worden doorgegeven als argumenten.

De volgorde waarin argumenten worden geëvalueerd, kan variëren onder verschillende compilers en verschillende optimalisatieniveaus. De argumenten en eventuele bijwerkingen worden echter volledig geëvalueerd voordat de functie wordt ingevoerd. Zie Bijwerkingen voor informatie over bijwerkingen.

De expressielijst in een functieoproep wordt geëvalueerd en de gebruikelijke rekenkundige conversies worden uitgevoerd op elk argument in de functie-aanroep. Als er een prototype beschikbaar is, wordt het resulterende argumenttype vergeleken met de bijbehorende parameter van het prototype. Als deze niet overeenkomen, wordt een conversie uitgevoerd of wordt er een diagnostisch bericht uitgegeven. De parameters ondergaan ook de gebruikelijke rekenkundige conversies.

Het aantal expressies in de expressielijst moet overeenkomen met het aantal parameters, tenzij het prototype of de definitie van de functie expliciet een variabel aantal argumenten aangeeft. In dit geval controleert de compiler zo veel argumenten als er typenamen in de lijst met parameters staan en converteert deze, indien nodig, zoals hierboven beschreven. Zie Aanroepen met een variabel aantal argumenten voor meer informatie.

Als de parameterlijst van het prototype alleen het trefwoord voidbevat, verwacht de compiler nul argumenten in de functie-aanroep en nul parameters in de definitie. Er wordt een diagnostisch bericht uitgegeven als er argumenten worden gevonden.

Voorbeeld

In dit voorbeeld worden aanwijzers gebruikt als argumenten:

int main()
{
    /* Function prototype */

    void swap( int *num1, int *num2 );
    int x, y;
    .
    .
    .
    swap( &x, &y );  /* Function call */
}

/* Function definition */

void swap( int *num1, int *num2 )
{
    int t;

    t = *num1;
    *num1 = *num2;
    *num2 = t;
}

In dit voorbeeld wordt de swap functie gedeclareerd main met twee argumenten, respectievelijk vertegenwoordigd door id's num1 en num2, beide verwijzen naar int waarden. De parameters num1 en num2 in de definitie van de prototypestijl worden ook gedeclareerd als aanwijzers om waarden te int typen.

In de functie-aanroep

swap( &x, &y )

het adres van x wordt opgeslagen in num1 en het adres van y wordt opgeslagen in num2. Er bestaan nu twee namen of aliassen voor dezelfde locatie. Verwijzingen naar *num1 en *num2 in swap zijn effectief verwijzingen naar x en y in main. De opdrachten binnen de eigenlijk swap uitwisseling van de inhoud van x en y. Daarom is er geen return verklaring nodig.

De compiler voert typecontrole uit op de argumenten swap , omdat het prototype van swap argumenttypen voor elke parameter bevat. De id's tussen de haakjes van het prototype en de definitie kunnen hetzelfde of verschillend zijn. Wat belangrijk is, is dat de typen argumenten overeenkomen met die van de parameterlijsten in zowel het prototype als de definitie.

Zie ook

Functie-aanroepen