La inicialización hace que el puntero sea un número entero sin conversión – C

2 minutos de lectura

Lo siento si esta publicación parece ignorante, pero todavía soy muy nuevo en C, por lo que no lo entiendo muy bien. En este momento estoy tratando de averiguar los punteros.

Hice este fragmento de código para probar si puedo cambiar el valor de b en la función de cambio, y hacer que se transfiera a la función principal (sin regresar) pasando el puntero.

Sin embargo, me sale un error que dice.

Initialization makes pointer from integer without a cast
    int *b = 6

Por lo que entiendo,

#include <stdio.h>

int change(int * b){
     * b = 4;
     return 0;
}

int main(){
       int * b = 6;
       change(b);
       printf("%d", b);
       return 0;
}

Lo que realmente me preocupa es corregir este error, pero si mi comprensión de los punteros es completamente incorrecta, no me opondría a las críticas.

  • Desde el change la función no devuelve nada útil, debe declararlo void.

    – Barmar

    29 de octubre de 2015 a las 1:52

Para que funcione, reescriba el código de la siguiente manera:

#include <stdio.h>

int change(int * b){
    * b = 4;
    return 0;
}

int main(){
    int b = 6; //variable type of b is 'int' not 'int *'
    change(&b);//Instead of b the address of b is passed
    printf("%d", b);
    return 0;
}

El código anterior funcionará.

En C, cuando desea cambiar el valor de una variable en una función, “pasa la variable a la función por Referencia“. Puedes leer más sobre esto aquí – Pasar por Referencia

Ahora el error significa que está tratando de almacenar un número entero en una variable que es un puntero, sin encasillar. Puede hacer que este error desaparezca cambiando esa línea de la siguiente manera (pero el programa no funcionará porque la lógica seguirá siendo incorrecta)

int * b = (int *)6; //This is typecasting int into type (int *)

Tal vez querías hacer esto:

#include <stdio.h>

int change( int *b )
{
  *b = 4;
  return 0;
}

int main( void )
{
  int *b;
  int myint = 6;

  b = &myint;
  change( &b );
  printf( "%d", b );
  return 0;
}

#include <stdio.h>

int change(int * b){
     * b = 4;
     return 0;
}

int main(){
       int  b = 6; // <- just int not a pointer to int
       change(&b); // address of the int
       printf("%d", b);
       return 0;
}

Tal vez demasiado tarde, pero como complemento al resto de las respuestas, solo mis 2 centavos:

void change(int *b, int c)
{
     *b = c;
}

int main()
{
    int a = 25;
    change(&a, 20); --> with an added parameter
    printf("%d", a);
    return 0;
}

En las declaraciones de puntero, solo debe asignar la dirección de otras variables, por ejemplo, “&a”..

¿Ha sido útil esta solución?