2010-03-17 18 views

Respuesta

9

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.

+0

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

+0

@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

+0

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

15

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.

+0

Y pronto std :: array :) – coelhudo

+2

En este punto, espero estar recogiendo la seguridad social cuando C++ 4x esté finalizado. –

+0

No veo cuál es el problema: puedes usar boost :: array ahora mismo. –

3

¿Quieres decir algo como:

int a[10]; 
int *start = a; 
int *end = a + 10; 
size_t n = end - start; /* pointers! :-) */ 
+2

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)'. –

+0

@Tyler: gracias. –

0

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.

+1

En el caso de * strings * es convencionalmente '\ 0'. No cada conjunto de caracteres es una cadena. – Potatoswatter