2012-04-24 17 views
26

Tengo una matriz de int y necesito encontrar la cantidad de elementos en ella. Sé que tiene algo que ver con sizeof pero no estoy seguro de cómo usarlo exactamente.¿Cómo puedo encontrar la cantidad de elementos en una matriz?

+5

Echa un vistazo a esto. http://stackoverflow.com/questions/4081100/c-finding-the-number-of-elements-in-an-array – twain249

+0

Si está en MSVC, tiene _countof –

+0

Si bien todos tienen la solución, quiero señale que es muy probable que no haya forma de encontrar el tamaño de una matriz dinámica a menos que haya grabado el tamaño porque sizeof (a) del puntero a es el tamaño del puntero 'int * a = new int [10 ] 'en este caso encontrar' sizeof (* a) 'es de 4 bytes. Por lo tanto, es importante mantener la verificación del tamaño de la matriz. – CppLearner

Respuesta

12
int a[20]; 
int length; 
length = sizeof(a)/sizeof(int); 

y se puede utilizar otra manera de hacer que su código no ser modificable a int

dicen que si tiene una matriz array

sólo tiene que:

int len = sizeof(array)/sizeof(array[0]); 
31

Si tiene su matriz en alcance, puede usar sizeof para determinar su tamaño en bytes y usar la división para calcular la cantidad de elementos:

#define NUM_OF_ELEMS 10 
int arr[NUM_OF_ELEMS]; 
size_t NumberOfElements = sizeof(arr)/sizeof(arr[0]); 

Si usted recibe una matriz como un argumento de función o asignar una matriz en el montón que no se puede determinar su tamaño mediante el sizeof. Vas a tener que almacenar/pasar la información de tamaño de alguna manera para poder utilizarlo:

void DoSomethingWithArray(int* arr, int NumOfElems) 
{ 
    for(int i = 0; i < NumOfElems; ++i) { 
     arr[i] = /*...*/ 
    } 
} 
5

personalmente creo que sizeof (a)/sizeof (* a) se ve más limpio.

También prefiero definirlo como una macro:

#define NUM(a) (sizeof(a)/sizeof(*a)) 

A continuación, puede utilizarlo en fines de bucles, de esta manera:

for (i = 0; i < NUM(a); i++) 
+5

Podría hacer esto, pero resultaría en el cálculo del tamaño cada vez que realiza la prueba en el ciclo for, así que una vez cada iteración. Y entonces estaría haciendo división cada vez a través del ciclo. Sería más eficiente asignar el resultado de 'NUM (a)' a una variable de instancia justo encima del bucle, y usar ese valor en el bucle. – Gavin

+5

@Gavin no, no calcularía el tamaño para cada iteración. El compilador es lo suficientemente inteligente como para ver que los resultados de cada tamaño y de la división son constantes y determina el resultado en tiempo de compilación, que luego compila en el código como un número constante. Es posible que haya sido engañado por el aspecto de la aplicación 'sizeof', que se ve como una función debido a los paréntesis, pero no es una función. 'sizeof' es un operador y los paréntesis son solo una convención. – blubberdiblub

-2
template <typename Type, int N> 
inline int getElementCount(Type (&array)[N]) 
{ 
    (void)array; // (required to avoid a spurious warning in MS compilers) 
    (void)sizeof(0[array]); // This line should cause an error if you pass an object with a user-defined subscript operator 
    return N; 
} 
+1

Lenguaje incorrecto. –

1

utilicé siguiente código como se sugirió anteriormente para evaluar el número de elementos en mi matriz bidimensional:

#include <stdio.h> 
#include <string.h> 

void main(void) 
{ 
    char strs[3][20] = 
    { 
     {"January"}, 
     {"February"}, 
     {""} 
    }; 

    int arraysize = sizeof(strs)/sizeof(strs[0]); 

    for (int i = 0; i < arraysize; i++) 
    { 
     printf("Month %d is: %s\n", i, strs[i]); 
    } 

} 

Funciona muy bien. Por lo que sé, no puedes mezclar diferentes tipos de datos en matrices C y también debes tener el mismo tamaño de todos los elementos de la matriz (si estoy en lo cierto), por lo tanto puedes aprovecharlo con este pequeño truco:

  1. número de recuento de bytes con función sizeof() desde toda matriz 2D (en este caso 3 * 20 = 60 bytes) número
  2. recuento de bytes con sizeof() la función de primeros RTS elemento de matriz [0] (en este caso 20 bytes)
  3. dividir el tamaño del conjunto con el tamaño de un elemento lo que le dará el número de elementos

Este recorte debe ser portátil para arreglos 2D en C; sin embargo, en otros lenguajes de programación no podría funcionar porque puede usar diferentes tipos de datos dentro de una matriz con diferentes tamaños (como en JAVA).

3

No es posible encontrar la cantidad de elementos en una matriz a menos que sea una matriz de caracteres. Considere el siguiente ejemplo:

int main() 
{ 
    int arr[100]={1,2,3,4,5}; 
    int size = sizeof(arr)/sizeof(arr[0]); 
    printf("%d", &size); 
    return 1; 
} 

El valor anterior nos da el valor 100 incluso si el número de elementos es cinco. Si se trata de una matriz de caracteres, puede buscar linealmente la cadena nula al final de la matriz y aumentar el contador a medida que avanza.

+0

I cosa que quería escribir: 'printf ("% d ", tamaño);'. Pero estás en lo cierto, ¡puedes encontrar solo el tamaño definido de la matriz, no el tamaño real! – uetoyo

2
#include<stdio.h> 
int main() 
{ 
    int arr[]={10,20,30,40,50,60}; 
    int *p; 
    int count=0; 

    for(p=arr;p<&arr+1;p++) 
     count++; 

    printf("The no of elements in array=%d",count); 

    return 0; 
} 

de salida = 6

EXPLICACIÓN

p es un puntero a una matriz de 1-D, y en el bucle for(p=arr,p<&arr+1;p++) hice p punto a la dirección base . Supongamos que su dirección base es 1000; si incrementamos p, apunta a 1002 y así sucesivamente. Ahora llegando al concepto de &arr - Básicamente representa toda la matriz, y si agregamos 1 a toda la matriz, es decir &arr+1, da la dirección 1012, es decir, la dirección de la siguiente matriz 1-D (en nuestro caso, el tamaño de int es 2), por lo que la condición se convierte en 1000 < 1012.

así que, básicamente, la condición se convierte

for(p=1000;p<1012;p++) 

y ahora vamos a ver la condición y contar el valor

  • primera vez p=1000 y p<1012 condición es true: entrar en el bucle, incrementar el valor de count a 1.
  • segundo tiempo p=1002 y p<1012 condición es true: entrar en el bucle, incremente el valor de count a 2.
  • ...
  • 6ª vez p=1010 y p<1012 condición es true: entrar en el bucle, incrementar el valor de count a 6.
  • última vez p=1012 y p<1012 condición es falsa: imprimir el valor de count=6 en printf declaración.
+0

Esto no funciona (al menos en C++). Tendría que convertir '& arr + 1' en (int *) así:' for (p = arr; p <(int *) (& arr + 1); p ++) ' – Staszek

-1

En realidad, no hay una forma adecuada de contar los elementos en una matriz de enteros dinámicos. Sin embargo, el comando sizeof funciona correctamente en Linux, pero no funciona correctamente en Windows. Desde el punto de vista de un programador, no se recomienda usar sizeof para tomar la cantidad de elementos en una matriz dinámica. Deberíamos hacer un seguimiento de la cantidad de elementos al hacer la matriz.

+0

El operador' sizeof' solo devolverá el * size * de una matriz * declarada dentro del mismo ámbito *, de lo contrario, 'sizeof' simplemente informa el tamaño del * puntero * al que la matriz se convirtió cuando pasó como parámetro. No tiene nada que ver con el sistema operativo y no hay ninguna recomendación contra el uso de 'sizeof' en cualquiera que no sea la comprensión de lo que está tomando el' sizeof'. (* sin juego de palabras *). –

-1

i su mayoría se encuentran una manera fácil de ejecutar la longitud de la matriz dentro de un bucle al igual que

int array[] = {10, 20, 30, 40}; 
int i; 
for (i = 0; i < array[i]; i++) { 
    printf("%d\n", array[i]); 
} 
0

Si no sabemos el número de elementos de la matriz y cuando la entrada está dada por la usuario en el tiempo de ejecución. Entonces podemos escribir el código como

C CÓDIGO:

while(scanf("%d",&array[count])==1) { 
    count++; 
} 

código C++:

while(cin>>a[count]) { 
    count++; 
} 

Ahora el recuento va a tener el recuento del número de elementos de matriz que se introducen.

Cuestiones relacionadas