2012-09-24 13 views
5

Le 2 funzioni seguenti sono essenzialmente la stessa funzione?È un parametro int * esattamente uguale a un parametro int []

ie, è un int* esattamente uguale a int[]?

int myFunction(int* xVals, int* yVals, int nVertices); 
int myFunction(int xVals[], int yVals[], int nVertices); 

Come posso utilizzare la funzione di prima? Cioè, come posso passare array nei parametri? È il seguente valido/corretto?

int xVals[5], yVals[5], zVals[5]; 
myFunction(xVals, yVals, zVals, 5); 

// or should it be.. 
myFunction(&xVals[0], &yVals[0], &zVals[0], 5); 
+4

Sei sicuro che non significa 'int xVals []'? – cnicutar

+0

@cnicutar yes sry dovrebbe essere quello –

+0

Nessun problema, ora posso riferirti a [Ma ho sentito che char 'a []' era identico a char '* a'] (http://c-faq.com/ aryptr/aryptr2.html) – cnicutar

risposta

8

In un elenco di parametri funzione, quindi le dichiarazioni di funzione sono equivalenti:

int myFunction(int* xVals, int* yVals, int nVertices); 
int myFunction(int xVals[], int yVals[], int nVertices); 

Tuttavia, questo non è in grado generalizzare. All'interno di una funzione, v'è una grande differenza tra:

int AnotherFunction(void) 
{ 
    int array[] = { 0, 1, 2, 3 }; 
    int *iptr = &array[0]; 
    ... 
} 

E in una funzione di interfaccia, c'è una grande differenza tra i tipi di due parametri:

int arrays_vs_pointers(int **iptrptr, int array[][12]); 

È inoltre chiedere di (corretto):

int xVals[5], yVals[5]; 
myFunction(xVals, yVals, 5); 

// or should it be.. 
myFunction(&xVals[0], &yVals[0], 5); 

Queste chiamate sono entrambe valide e sono equivalenti tra loro.


La risposta alla tua domanda titolo originale 'è un int * esattamente la stessa di un int []?No.

Ci sono un numero molto limitato di circostanze in cui sono equivalenti, ma ci sono molte altre circostanze in cui sono molto diversi.

La risposta alla domanda di titolo modificata 'È un parametro int * esattamente uguale a un parametro int []?!

2

La domanda nel titolo è diversa dalla domanda nel post vero e proprio corpo ...

In generale, è vero che i puntatori sono le stesse di array, quindi in molti casi, int [] non corrisponde a int *.

Tuttavia, in una dichiarazione funzione (o definizione), quando una matrice dimensione viene passato come argomento, decade in un puntatore, ecco perché, in contrasto con il primo caso,

int myFunction(int *xVals, int *yVals, int nVertices); 

e

int myFunction(int xVals[], int yVals[], int nVertices); 

sono equivalenti.

1

Le risposte precedenti sono corrette. Questo è solo aggiungere che si dispone di un numero di parametri non corrispondenti tra il dichiarazione e la chiamata:

int myFunction(int* xVals, int* yVals, int nVertices); 

myFunction(xVals, yVals, zVals, 5); 

myFunction è in attesa di 3 parametri, ma si sta passando a 4 nella chiamata.

0

Alcune interessanti (? Utili) punti intorno tali caratteristiche specifiche dei parametri:

  • se si specifica una dimensione per un parametro array 1-dimensionale, non è selezionata in alcun modo contro la tesi del chiamante fornito, per esempio: f(int x[5]) può essere chiamato ala int x[] = { 1, 2}; f(x); o anche int x; f(&x);

  • se si accetta un riferimento a un parametro, quindi le dimensioni sono controllato e deve corrispondere, per esempio: f(int (&x)[5]) possono essere solo chiamato con un argomento che è un array intero con esattamente 5 elementi (o qualcosa espressi a quel tipo)

  • modelli possono essere utilizzati per catturare dimensioni compilatore noti dei parametri, come in: template <size_t N> void f(int (&x)[N]) { ...can use N in here... }

  • per questi ultimi due parametri di riferimento, non è possibile passare in alcun vecchio puntatore-a-int ... se il puntatore corrisponde a un array appropriato, è necessario convertirlo prima in

  • che i parametri di riferimento vengono controllati durante la compilazione -time suggerisce che dovrebbero essere preferiti quando il numero di argomenti è noto al momento della compilazione ... in pratica può essere uno smidge più complicato di così, per esempio una libreria che fornisce un'intestazione che dichiara void f(int[]); potrebbe ancora variare l'implementazione e spedire un nuovo oggetto libreria che supporta l'elaborazione di una matrice di dimensioni diverse (che dovrebbe rilevare in base ad altri argomenti o sentinel) convension) senza un cambiamento di intestazione che richiede o innescando la ricompilazione del cliente (nella maggior parte dei sistemi di compilazione)

Problemi correlati