¿Cómo en C++ se obtiene la longitud de la matriz con solo punteros? Sé que el nombre de la pestaña es un puntero al primer elemento, pero ¿qué sigue?Longitud de la matriz con punteros
Respuesta
No puede. Un puntero es solo una ubicación de memoria y no contiene nada especial que pueda determinar el tamaño.
Dado que este es C++, lo que puede hacer es pasar la matriz por referencia, así:
template <typename T, size_t N>
void handle_array(T (&pX)[N])
{
// the size is N
pX[0] = /* blah */;
// ...
pX[N - 1] = /* blah */;
}
// for a specific type:
template <size_t N>
void handle_array(int (const &pX)[N]) // const this time, for fun
{
// the size is N
int i = pX[0]; // etc
}
Pero por lo demás que necesita para pasar comenzar & final y hacer una resta, como Alok sugiere, un comienzo & tamaño, como sugiere, o eliminar una matriz estática y utilizar un vector, como sugiere Tyler.
Si conoce el tamaño de la matriz que va a trabajar con, usted puede hacer una typedef
:
typedef int int_array[10];
void handle_ten_ints(int_array& pX)
{
// size must be 10
}
Y sólo por el tamaño:
template <typename T, size_t N>
size_t countof(T (&pX)[N])
{
return N;
}
template <typename T, size_t N>
T* endof(T (&pX)[N])
{
return &pX[0] + N;
}
// use
int someArray[] = {1, 2, 6, 2, 8, 1, 3, 3, 7};
size_t count = countof(someArray); // 9
std::for_each(someArray, endof(someArray), /* ... */);
utilizo estas funciones de utilidad de vez en cuando.
No puede hacerlo. Debe pasar la longitud de la matriz junto con el puntero de matriz, o debe usar un objeto contenedor como std::vector
.
Y pronto std :: array :) – coelhudo
En este punto, espero estar recogiendo la seguridad social cuando C++ 4x esté finalizado. –
No veo cuál es el problema: puedes usar boost :: array ahora mismo. –
¿Quieres decir algo como:
int a[10];
int *start = a;
int *end = a + 10;
size_t n = end - start; /* pointers! :-) */
No, un puntero "final" es convencionalmente un final pasado (que es legal) específicamente para que end - start = length, y para que pueda hacer cosas como 'for (int * i = start; i! = end; ++ i)'. –
@Tyler: gracias. –
No se puede, a menos que sepa lo que el puntero desreferencias final a. En el caso de los arreglos de caracteres, es un '\ 0', por lo que puede hacer un bucle hasta que lea ese personaje para determinar la longitud.
En el caso de * strings * es convencionalmente '\ 0'. No cada conjunto de caracteres es una cadena. – Potatoswatter
- 1. matrices de longitud cero frente a punteros
- 2. matriz de punteros C
- 3. longitud de cadena entre los punteros
- 4. malloc una matriz de punteros struct
- 5. una matriz de punteros que apuntan a la misma matriz
- 6. Matriz de longitud cero
- 7. Puntero a matriz de punteros
- 8. punteros de matriz C++ [] o ++
- 9. ¿Cómo funciona una matriz de punteros a punteros?
- 10. Cómo aumentar la longitud de una matriz
- 11. longitud de la matriz en Java
- 12. Buscar longitud de la matriz 2D Python
- 13. Matriz de punteros de función en C
- 14. K & R: matriz de punteros de caracteres
- 15. ¿Repite la matriz hasta cierta longitud?
- 16. matriz JSON obtener longitud
- 17. Matriz de (punteros a un registro)
- 18. Matriz de punteros de función en Java
- 19. punteros que apuntan a la matriz de números enteros
- 20. matriz de punteros a char arrays
- 21. PInvoke, punteros y copia de matriz
- 22. ¿Cómo creo una matriz de punteros?
- 23. Obtener longitud de matriz de cadenas de longitud desconocida
- 24. matriz dinámica de punteros a estructuras
- 25. matriz de la descomposición de los punteros en las plantillas
- 26. determinar la longitud de una cadena literal
- 27. C++ matriz de punteros a la matriz en la plataforma de memoria limitada (Arduino)
- 28. C: matriz dinámica de punteros a la matriz de la estructura
- 29. Cómo configurar la longitud de la matriz en C# dinámicamente
- 30. Declaración de una matriz de longitud negativa
Será mejor que use 'typedef' para crear un tipo de matriz, y aceptar una referencia a eso, para eliminar la' plantilla', a menos que estos métodos vayan a estar en un archivo de cabecera y el tamaño de la matriz realmente varíe (aún tiempo de compilación determinista). – Potatoswatter
@Potatoswatter: No conozco una forma de hacer un typedef así. La función no conoce N hasta que se crea una instancia con una llamada. Agregaré un ejemplo de typedef, ¿es eso lo que quieres decir? – GManNickG
Sí, el ejemplo typedef que ha agregado es lo que quise decir. 'plantilla' es agradable con tamaño automático 'int ary [] = {...};' pero la creación de instancias puede ser inconveniente/confusa y el beneficio es poco AFAIK a menos que la matriz se declare así. O el usuario está trabajando con varios tamaños fijos. –
Potatoswatter