ottenere la dimensione della matrice dal puntatore c ++

Sto scrivendo una semplice funzione che restituisce il numero intero più grande in un array. Il problema che sto avendo è trovare il numero di elementi nella matrice.

Ecco l’intestazione della funzione:

int largest(int *list, int highest_index) 

Come posso ottenere il numero di numeri interi nella ‘lista’ dell’array.

Ho provato i seguenti metodi:

 int i = sizeof list/sizeof(int); //returns incorrect value int i = list.size(); // does not compile 

Qualsiasi aiuto sarà molto apprezzato!

C ++ è basato su C e ne eredita molte funzioni. In relazione a questa domanda, eredita qualcosa chiamato “array / pointer equivalence” che è una regola che consente a un array di decadere su un puntatore, specialmente quando viene passato come argomento di funzione. Ciò non significa che un array sia un puntatore, significa solo che può decadere a uno.

 void func(int* ptr); int array[5]; int* ptr = array; // valid, equivalent to 'ptr = &array[0]' func(array); // equivalent to func(&array[0]); 

Quest’ultima parte è la più pertinente alla tua domanda. Non stai passando l’array, stai passando l’indirizzo dell’elemento 0th.

Affinché la tua funzione sappia quanto è grande l’array in arrivo, dovrai inviare tali informazioni come argomento.

 static const size_t ArraySize = 5; int array[ArraySize]; func(array, ArraySize); 

Poiché il puntatore non contiene informazioni sulle dimensioni, non è ansible utilizzare sizeof.

 void func(int* array) { std::cout << sizeof(array) << "\n"; } 

Questo produrrà la dimensione di "int *" - che è 4 o 8 byte a seconda di 32 contro 64 bit.

Invece è necessario accettare i parametri di dimensione

 void func(int* array, size_t arraySize); static const size_t ArraySize = 5; int array[ArraySize]; func(array, ArraySize); 

Anche se provi a passare un array di dimensioni fisse, si scopre che questo è zucchero sintattico:

 void func(int array[5]); 

http://ideone.com/gaSl6J

Ricorda come ho detto che un array NON è un puntatore, solo equivalente?

 int array[5]; int* ptr = array; std::cout << "array size " << sizeof(array) << std::endl; std::cout << "ptr size " << sizeof(ptr) << str::endl; 

la dimensione dell'array sarà 5 * sizeof (int) = 20 la dimensione ptr sarà sizeof (int *) che sarà di 4 o 8 byte.

sizeof restituisce la dimensione del tipo che viene fornito, se si fornisce un object, questo deduce il tipo e ne restituisce la dimensione

Se vuoi sapere quanti elementi di una matrice sono nell'array, quando hai la matrice e non un puntatore, puoi scrivere

 sizeof(array) / sizeof(array[0]) 

o sizeof (array) / sizeof (* array)

Non c’è modo di farlo. Questa è una buona ragione (tra le tante) per usare i vettori anziché gli array. Ma se è necessario utilizzare un array, è necessario passare la dimensione dell’array come parametro alla propria funzione

 int largest(int *list, int list_size, int highest_index) 

Le matrici in C ++ sono piuttosto scadenti, prima imparerai a usare i vettori, più facilmente troverai le cose.

I puntatori non hanno informazioni sul numero di elementi a cui si riferiscono. Se parli del primo argomento della chiamata di funzione, se l’elenco è un array puoi effettivamente usare la syntax

 sizeof( list ) / sizeof( int ) 

Vorrei aggiungere che ci sono tre approcci. Il primo è utilizzare gli array passati per riferimento. Il secondo è usare il puntatore al primo elemento e il numero di elementi. E il terzo consiste nell’utilizzare due puntatori: il puntatore iniziale e l’ultimo puntatore, in quanto di solito vengono definiti algoritmi standard. Gli array di caratteri hanno un’ulteriore possibilità di processarli.

La semplice risposta è che non puoi. È necessario memorizzarlo in una variabile. Il grande vantaggio con C ++ è che ha STL e puoi usare il vettore. Il metodo size () dà la dimensione del vettore in quell’istante.

 #include #include using namespace std; int main () { vector v; for(int i = 0; i < 10; i++) { v.push_back(i); } cout << v.size() << endl; for(int i = 0; i < 10; i++) { v.push_back(i); } cout << v.size() << endl; return 0; } 

produzione:
10
20

Non testato. Ma, dovrebbe funzionare. 😉

È necessario ricordare in una dimensione di matrice variabile, non è ansible recuperare la dimensione dell’array dal puntatore.

 const int SIZE = 10; int list[SIZE]; // or int* list = new int[SIZE]; // do not forget to delete[]