obteniendo el tamaño de la matriz desde el puntero c++
Estoy escribiendo una función simple que devuelve el número entero más grande de una matriz. El problema que tengo es encontrar la cantidad de elementos en la matriz.
Aquí está el encabezado de la función:
int largest(int *list, int highest_index)
¿Cómo puedo obtener el número de números enteros en la matriz 'lista'?
He probado los siguientes métodos:
int i = sizeof list/sizeof(int); //returns incorrect value
int i = list.size(); // does not compile
¡Cualquier ayuda será apreciada!
C++ se basa en C y hereda muchas características de él. En relación con esta pregunta, hereda algo llamado "equivalencia de matriz/puntero", que es una regla que permite que una matriz se descomponga en un puntero, especialmente cuando se pasa como argumento de función. No significa que una matriz sea un puntero, solo significa que puede descomponerse en uno.
void func(int* ptr);
int array[5];
int* ptr = array; // valid, equivalent to 'ptr = &array[0]'
func(array); // equivalent to func(&array[0]);
Esta última parte es la más relevante para su pregunta. No estás pasando la matriz, estás pasando la dirección del elemento 0.
Para que su función sepa qué tan grande es la matriz entrante, deberá enviar esa información como argumento.
static const size_t ArraySize = 5;
int array[ArraySize];
func(array, ArraySize);
Debido a que el puntero no contiene información sobre el tamaño, no puede usar sizeof.
void func(int* array) {
std::cout << sizeof(array) << "\n";
}
Esto generará el tamaño de "int*", que es de 4 u 8 bytes dependiendo de 32 frente a 64 bits.
En su lugar, debes aceptar los parámetros de tamaño.
void func(int* array, size_t arraySize);
static const size_t ArraySize = 5;
int array[ArraySize];
func(array, ArraySize);
Incluso si intentas pasar una matriz de tamaño fijo, resulta que esto es azúcar sintáctico:
void func(int array[5]);
http://ideone.com/gaSl6J
¿Recuerdas que dije que una matriz NO es un puntero, sino simplemente equivalente?
int array[5];
int* ptr = array;
std::cout << "array size " << sizeof(array) << std::endl;
std::cout << "ptr size " << sizeof(ptr) << str::endl;
el tamaño de la matriz será5 * sizeof(int) = 20
El tamaño de ptr será sizeof(int *)
de 4 u 8 bytes.
*sizeof
devuelve el tamaño del tipo que se proporciona, si proporciona un objeto, deduce el tipo y devuelve el tamaño del mismo.
Si quieres saber cuantos elementos de un array hay en el array, cuando tengas el array y no un puntero, puedes escribir:
sizeof(array) / sizeof(array[0])
o
sizeof(array) / sizeof(*array)
No hay manera de hacer eso. Esta es una buena razón (entre muchas) para utilizar vectores en lugar de matrices. Pero si debes usar una matriz, entonces debes pasar el tamaño de la matriz como parámetro a tu función.
int largest(int *list, int list_size, int highest_index)
Los arreglos en C++ son bastante pobres; cuanto antes aprendas a usar vectores, más fácil encontrarás las cosas.
La respuesta simple es que no puedes. Necesitas almacenarlo en una variable. La gran ventaja de C++ es que tiene STL y puedes usar vectores. El método size() proporciona el tamaño del vector en ese instante.
#include<iostream>
#include<vector>
using namespace std;
int main () {
vector<int> 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;
}
salida:
10
20
No probado. Pero debería funcionar. ;)
Los punteros no tienen información sobre la cantidad de elementos a los que hacen referencia. Si está hablando del primer argumento de la llamada a la función, entonces si la lista es una matriz, puede usar la sintaxis
sizeof( list ) / sizeof( int )
Me gustaría agregar que hay tres enfoques:
- utilizar matrices pasadas por referencia
- utilice el puntero al primer elemento y al número de elementos.
- utilice dos punteros: el puntero de inicio y el último puntero, como suelen definirse los algoritmos estándar. Las matrices de caracteres tienen una posibilidad adicional de procesarlos.