Pasar arreglos a una función en C

Por default, los arrreglos en C se pasan a una función como referencia y no como valor. Esto significa que todas las modificaciones que hagamos dentro de la función en C al arreglo que recibimos como parámetro, realmente se realizan en el arreglo original que se utilizó como argumento al momento de llamar a la función.

Al escribir una función en C, la forma de indicar que uno de los parámetros que se va a recibir es un arreglo de una dimensión, es decir de que tipo va a ser el arreglo y el nombre con el cual vamos a manipular dicho arreglo dentro de nuestra función seguido de corchetes que abren y cierran; nuestra función también debe recibir un segundo parámetro que nos indique el tamaño del arreglo, o dicho de otra forma, el número de elementos de los que consta nuestro arreglo, recordemos que como el arreglo se pasa a la función como referencia, lo que esta recibiendo la función en realidad es un apuntador al primer elemento del arreglo, pero no sabe en donde termina el arreglo, por eso es necesario que la función también reciba como parámetro el número de elementos del arreglo.

Por ejemplo, el prototipo de una función en C que va a regresar un entero y va a recibir un arreglo de 10 elementos de tipo entero sería algo asi:

int MiFuncion(int mi_arreglo[], int num_elemetos);

Para llamar a la función anterior, se pone como primer argumento el nombre del arreglo (sin corcehetes) y como segundo argumento el número de elementos del arreglo. Supongamos que tenemos un arreglo de 10 elementos de tipo entero llamado numeros y queremos guardar en una variable llamada “x” el valor que nos regresa la función “MiFuncion” al llamarla pasandole como argumentos el arreglo “numeros”, haríamos algo como esto

x = MiFuncion(numeros, 10);

El siguiente programa solicita al usuario que ingrese 10 números de tipo entero y los almacena en un arreglo; después le pide que introduzca un número para que busque su posición dentro del arreglo..

El programa utiliza una función llamada BuscaNumero que recibe como parámetros el arreglo con los 10 números capturados, el número de elementos del arreglo (en este caso 10) y el número del cual se desea saber su posición dentro del arreglo.. La función regresa -1 si el número que se busca no se encuentra en el arreglo y en caso contrario, regresa la primera posición del arreglo que contiene dicho número.

El programa también utiliza una función llamada MuestraArreglo que no regresa valor alguno, sólo recibe como parámetros el arreglo y el número de elementos. Esta función imprime en pantalla los elementos del arreglo separados por un tabulador.

#include <stdio.h>

int BuscaNumero(int valores[], int tamanio, int busca)
{
int i=0, posicion=-1;

do
  {
   if (valores[i]==busca)
       posicion=i;
   else
       ++i;
  }
while(i<tamanio && posicion<0);

return posicion;
}

void MuestraArreglo(int valores[], int tamanio)
{
 int i=0;

 for (i=0; i<tamanio; ++i)
      printf("%d\t",valores[i]);
 printf("\n");
}

int main()
{
 int x=0, numero=0, posicion=0;
 int ar_numeros[10] = {0};

 printf("Introduzca los 10 numeros enteros que se almacenaran en el arreglo\n");
 for (x=0; x<10; ++x)
     {
      printf("Valor para el elemento [%d]: ", x);
      scanf("%d",&ar_numeros[x]);
     }
 printf("\n");

 printf("Introduzca el número que desea buscar en el arreglo\n");
 scanf("%d",&numero);
 printf("\n");
 MuestraArreglo(ar_numeros,10);

 posicion=BuscaNumero(ar_numeros,10,numero);
 if (posicion != -1)
     printf("El número %d está en la posición %d del arreglo\n",numero, posicion);
 else
     printf("El número %d no está en el arreglo\n",numero);

 return 0;
}

Para pasar a una función un arreglo de dos dimensiones, si debemos indicar el tamaño de la segunda dimensión del arreglo

Ejemplo:int MiFuncion(int mi_arreglo[][5], int num_elemetos);

El siguiente programa le pide al usuario que introduzca 9 números y los almacena en un arreglo de dos dimensiones, en este caso una matriz de 3×3; posteriormente utiliza una función llamada ImprimeMatriz para mostrar como quedaron almacenados los números en la matriz. Dicha función recibe como parámetros, la matriz de 3×3 y el tamaño de la primera dimensión (normalmente la primera dimensión son filas y la segunda dimensión columnas).

#include <stdio.h>

void ImprimeMatriz(int m[][3], int filas)
{
 int i=0,j=0;

 for (i=0; i<filas; ++i)
     {
      for (j=0; j<3; ++j)
          {
           printf("%d ",m[i][j]);
          }
      printf("\n");
     }
}

int main()
{
 int x=0,y=0;
 int matriz[3][3] = {{0},{0},{0}};

 printf("Introduzca los valores para la matriz\n");
 for (x=0; x<3; ++x)
     {
      for (y=0; y<3; ++y)
          {
           printf("Valor para el elemento [%d][%d]: ", x, y);
           scanf("%d",&matriz[x][y]);
          }
      printf("\n");
     }

 printf("Matriz\n");
 ImprimeMatriz(matriz, 3);

 return 0;
}

Etiquetas: ,

23 comentarios to “Pasar arreglos a una función en C”

  1. samuel ramos Says:

    void ImprimeMatriz(int m[][3], int filas)

    Y si en vez de poner el 3 pusiese una variable como por ejemplo columnas que habría que hacer?

    • rtmex Says:

      C no maneja arreglos dinámicos, así que si quieres usar una variable como tu lo planteas, tendrías que haberla declarado antes y haberle asignado un valor. Por ejemplo:

      int columnas=3;
      void ImprimeMatriz(int m[][columnas], int filas)
      {
       int i=0,j=0;
       
       for (i=0; i<filas; ++i)
           {
            for (j=0; j<columnas; ++j)
                {
                 printf("%d ",m[i][j]);
                }
            printf("\n");
           }
      }
      
  2. Skratch bit Says:

    y si quiero que la funcion reciba un arreglo, trabaje en el, por ejemplo ordenarlo y que retorne un arreglo, como se podria hacer?, usando punteros?, porque lo hago pero el primer elemento me aparece un numero extraño, creo que es la direccion del primer elemento…. por ejemplo: el arreglo son 3, 2, 2, 0 6. al pasar por la funcion queda: 5451440, 2, 2, 3, 6. me elimina el primer elemento. Como podria solucionar eso?

  3. Novato Says:

    Muchas gracias por los ejemplos. Un saludo.

  4. héctor Says:

    buenísimo me ayudó mucho, mil gracias

  5. jesus salas Says:

    y si quiero q por medio de una función permita buscar un elemento y determinar a través de un mensaje si existe ó no dentro del arreglo.

    • rtmex Says:

      Hola

      Eso es muy sencillo, sólo modificas la función para que ya no regrese la posición en caso de que el elemento se encuentre en el arreglo y -1 en caso de que no se encuentre, sino que ahora no regresará valor alguno, sino que imprimirá un mensaje indicando si se encuentra o no el elemento en el arreglo.

      void BuscaNumero(int valores[], int tamanio, int busca)
      {
      int i=0, posicion=-1;
       
      do
        {
         if (valores[i]==busca)
             posicion=i;
         else
             ++i;
        }
      while(i<tamanio && posicion<0);
      
      if (posicion >= 0) 
          printf("El elemento se encuentra en el arreglo");
      else
          printf("El elemento no se encuentra en el arreglo");
      }
      
  6. nominado Says:

    exelente!

  7. Matias Vallejo Says:

    hola, cómo me ayudaron tus ejemplos, podrías ayudarme con este:
    2. Elabore un programa el cual invoque a una función que tome como parámetro de entrada el contenido de una variable string (LETRAS) y regrese al punto de llamada el número de palabras diferentes de la variable leída. Considere que las palabras están separadas por un espacio en blanco.

    • rtmex Says:

      Ok, se ve que es una tarea, como ya mencioné en algún otro post, este blog no es para hacerle la tarea a algún estudiante. Así que lo que voy a hacer es indicarte que instrucciones puedes usar para hacer lo que te piden y tú tendrás que estudiarlas y hacer tú programa.

      Debido a que están hablando de una “variable string” y en C no existe el tipo string (para manejar cadenas se hace un arreglo de tipo char), supongo que entónces están hablando de C++ (ahí si existe el tipo String).
      Lo que te piden lo puedes hacer utilizando la función find. Ahora sólo para estar claros, el texto dice “regrese al punto de llamada el número de palabras diferentes de la variable leída”; esto me indica que el comportamiento de la función que te piden que hagas en tú programa debe ser el siguiente:

      Caso 1
      La variable tipo String contiene el texto “palabra1 palabra2 palabra3”
      Tu función debería regresar el número 3, ya que la variable contiene 3 palabras diferentes

      Caso 2
      La variable tipo String contiene el texto “palabra1 palabra2 palabra1 palabra3 palabra4 palabra2”
      Tu función debería regresar el número 4, ya que la variable contiene 4 palabras diferentes debido a que palabra1 y palabra2 aparecen 2 veces, y el ejercicio dice palabras diferentes

      Espero esto te sirva.

      Saludos

  8. andres Says:

    al momento de ingresar 2 veces o mas un numero ,quisiera que me lo muestre las posiciones de este ,gracias

  9. WSQ10 Lists – Learning to program 2016 Says:

    […] Array in a function […]

  10. espitia Says:

    Como almaceno en un vector el nombre, el sexo y la edad de un grupo de personas e imprimir lo siguiente:

    a) Promedio de edades.
    b) Cuantas mujeres existen
    c) Cuantos hombres existen
    c) Los nombres de todas las personas que tienen la menor edad

    • rtmex Says:

      Puedes hacer una matriz de 3 x n (3 columnas x n renglones o filas), una columna para el nombre, una para el sexo y otra para la edad; la edad la tendrás que almacenar como char (en C no puedes almacenar datos de diferentes tipos en una misma matriz) y convertirlo a algún tipo numérico para hacer tus operaciones como el promedio de edades, ordenar con base en la edad, etc. N es el número máximo de registros (personas) que podrá admitir tu matriz.

      Si lo quieres hacer en C++ en lugar de C, hay mejores soluciones, te recomiendo que leas este post que escribí para que te des una idea Usando cadenas, vectores y estructuras con la STL

      Saludos

  11. david retiz Says:

    y si quiero que el usuario ingrese el tamaño de la matriz, y que tambien busque un numero y diga en que posicion de matriz esta ?

    • rtmex Says:

      En C no hay arreglos dinámicos, así que el tamaño de la matriz tiene que estar determinado desde que declaras la matriz.

  12. Nancy López Says:

    y si quiero hacer lo del primer programa pero con caracteres?

  13. Milton Says:

    interesante. se puede crear funciones de tal manera que al ingresar por teclado un string digamos “efecto1” lo evalue y luego devuelva algún entero para entrar a un switch y ejecutar lo que corresponda? entiendo que el switch no acepta strings.

    gracias.
    Milton

  14. Miguel Angel Says:

    Buenas tardes estoy programando en C y tengo esta duda, si tengo un puntero inicializado al primer elemento de un vector y quiero ordenarlo con funciones como puedo regresar el puntero o vector ya ordenado por las funciones? espero alguien me pueda ayudar.

  15. Hanel Says:

    Tengo un codigo donde primero lleno una matriz y luego los valores de las posiciones pares e impares deban guardarse en vectores diferentes y a cada vector hay que imprimir la suma de los valores pero al hacerlo no me aparecen unos números extraños que no corresponden al valor de la suma cuál podría ser el error que se está cometiendo?

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s


A %d blogueros les gusta esto: