0

Tengo un ejercicio en C++/C para hacer la media de un array utilisando el "formalismo puntero" ("formalisme pointeur" en francés). Por ejemplo este siguiente utiliza el "formalismo puntero" para manipular la tabla :

int tab[10];

for{int i = 0 ; i < 10 ; i ++ )
{
   *(tab + i) = 0
}

Pero este utiliza el "formalismo tabla" :

int tab[10];

for{int i = 0 ; i < 10 ; i ++ )
{
   tab[i] = 0
}

No entiendo bien si hacen la misma cosa...

Sin embargo he hecho el siguiente para calcular la media de une tabla de 10 numeros con el "formalismo tabla" ¿ como hacerlo con el "formalismo puntero" ?

#include<iostream>
#include <fstream>

using namespace std;

//Écrire, de deux manières différentes, un programme qui lit 10 nombres entiers et les stocke dans un tableau statique de taille 10 avant de calculer la media des éléments de ce tableau

void mediaTableau(int tabula[]){

    int media = 0;

    for(int i = 0; i<sizeof(tabula); i++){
        media = tableauEntiers[i] +moyenne;
    }

    cout << "media tabula " << media/sizeof(tabula) <<endl;
}

int main(){

    static int tabula[10];

    cout << "Da diez numeros" <<endl;

    for(int i = 0; i<10; i++){
            cin >> tabula[i];
            cout << "numero " << i+1 <<endl;
        }

        mediaTableau(tabula);

    return 0;

}
Trauma
  • 25,297
  • 4
  • 37
  • 60
Revolucion for Monica
  • 4,154
  • 4
  • 28
  • 80
  • Te he cambiado la etiqueta, de C a C++, que es el lenguaje en el que está escrito el código que muestras. – Trauma Feb 10 '17 at 17:19
  • [Esta pregunta](http://es.stackoverflow.com/questions/803/por-qu%c3%a9-la-expresi%c3%b3n-indicearreglo-es-equivalente-a-arregloindice) y [esta otra](http://es.stackoverflow.com/questions/46473/como-puedo-pasar-un-array-bidimensional-de-integers-a-una-funci%c3%b3n-void-para-pode/46708#46708) pueden serte de ayuda :) – PaperBirdMaster Feb 13 '17 at 07:38

1 Answers1

1

Efectivamente,

tabla[indice] == *( puntero + indice )

es una de las facilidades de C/C++ para trabajar con punteros, que te permite trabajar con ellos de la forma que te sea más comoda. Te permite abstraer el uso lógico (como organices tus datos) del uso físico (como el compilador maneja los datos en memoria).

Respecto a tu pregunta, has de cambiar tu función mediaTableau( ), añadiéndole un nuevo argumento: la longitud de la tabla, puesto que los punteros no proporcionan esa información:

void mediaTableau( int *tabula, size_t size ){
  int media = 0;

  for(int i = 0; i < size; ++i )
    media += *( tabula + i );

  cout << "media tabula " << media / size <<endl;
}

Y, consecuentemente, has de cambiar el modo de llamarla, indicando explicitamente el tamaño en elementos de la misma:

mediaTableau( tabula, sizeof( tabula ) / sizeof( tabula[0] ) );

EDITO

Tal y como indicas en los comentarios, un arreglo no es mas que una sucesión de elementos en memoria; cuando nosotros hacemos algo como

int lista[5] = { 1, 2, 3, 4, 5 };

el compilador genera en memoria exactamente lo que parece, una secuencia de 5 datos de tipo int, con los valores que le indicamos:

| 1 | 2 | 3 | 4 | 5 |

El concepto de arreglo o array no existe en el núcleo de los lenguajes C / C++. No son más que secuencias de bytes, y, en el ejemplo indicado, lista no es mas que un puntero a esa secuencia de bytes que el compilador genera.

Lo anterior es para la declaración de variables. Para su uso, los conceptos puntero y array son intercambiables, y permiten lo que ya vimos en la pregunta:

lista[0] == *lista == *( lista + 0 )
lista[1] == *( lista + 1 ) == lista[0][1]
lista[2] == *( lista + 2 ) == lista[0][2] == lista[1][1]

Ante expresiones del tipo

variable[indice1][indice2]...[indiceN]

el compilador las interpreta como

*( variable + ( indice1 + indice2 + ... + indiceN ) )

E incluso se permiten los índices negativos

variable[-1] == *( variable - 1 )

Cuidadito con lo que hacemos. Tanta libertad tiene un precio: el compilador no comprueba los índices que usamos. Desde su punto de vista, allá nosotros. Si hacemos

lista[100] = 0

estaremos escribiendo fuera del bloque de memoria al que apunta lista, y provocaremos cualquier cosa curiosa. Desde errores del sistema operativo, hasta cambiar el valor de otras variables.

Trauma
  • 25,297
  • 4
  • 37
  • 60