¿Cómo encontrar el tamaño de una array en C/C++ sin usar el operador sizeof()?

En C++, usamos el operador sizeof() para encontrar el tamaño del tipo de datos, variables y constantes deseados. Es un operador de ejecución en tiempo de compilación. Podemos encontrar el tamaño de una array usando el operador sizeof() como se muestra:

// Finds size of arr[] and stores in 'size'
int size = sizeof(arr)/sizeof(arr[0]);

¿Podemos hacer lo mismo sin usar el operador sizeof()? 

Dada una array (no conoce el tipo de elementos en la array), encuentre el número total de elementos en la array sin usar el operador sizeof()?

Enfoque 1: implementar nuestro propio tamaño de

CPP

// C++ program to find size of
// an array by writing our
// own sizeof operator
#include <bits/stdc++.h>
using namespace std;
  
// User defined sizeof macro
# define my_sizeof(type) ((char *)(&type+1)-(char*)(&type))
  
int main()
{
    int arr[] = {1, 2, 3, 4, 5, 6};
    int size = my_sizeof(arr)/my_sizeof(arr[0]);
  
    cout << "Number of elements in arr[] is "
        << size;
  
    return 0;
}

Producción:

Number of elements in arr[] is 6

Enfoque 2: Usando un truco de puntero

 La siguiente solución es muy corta en comparación con la solución anterior. El número de elementos en una array A se puede encontrar usando la expresión:

int size = *(&arr + 1) - arr; // &arr returns a pointer 

CPP

// C++ program to find size 
// of an array by using a 
// pointer hack
#include <bits/stdc++.h>
using namespace std;
  
int main()
{
    int arr[] = { 1, 2, 3, 4, 5, 6 };
    int size = *(&arr + 1) - arr;
    cout << "Number of elements in arr[] is " << size;
    return 0;
}

Producción:

Number of elements in arr[] is 6

¿Como funciona esto? 

Aquí la aritmética de punteros hace su parte. No necesitamos convertir explícitamente cada una de las ubicaciones en punteros de caracteres.

  • &arr : puntero a una array de 6 elementos. [Vea esto para ver la diferencia entre &arr y arr]
  • (&arr + 1) : la dirección de 6 enteros por delante como tipo de puntero es un puntero a una array de 6 enteros. En palabras simples, (&arr + 1) es la dirección de los números enteros por delante.
  • *(&arr + 1) – Misma dirección que (&arr + 1), pero el tipo de puntero es “int *”.
  • *(&arr + 1) – arr – Dado que *(&arr + 1) apunta a la dirección 6 enteros delante de arr, la diferencia entre dos es 6.

Este artículo es una contribución de Nikhil Chakravartula. Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo en write.geeksforgeeks.org . Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks. Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *