C | Puntero avanzado | Pregunta 1 – Part 1

void fun(int *p) 
{ 
  int q = 10; 
  p = &q; 
}     
    
int main() 
{ 
  int r = 20; 
  int *p = &r; 
  fun(p); 
  printf("%d", *p); 
  return 0; 
}

(A) 10
(B) 20
(C) Error del compilador
(D) Error de tiempo de ejecución

Respuesta: (B)
Explicación: Inside fun(), q es una copia del puntero p. Entonces, si cambiamos q para señalar otra cosa, entonces p permanece sin efecto. Si queremos cambiar un puntero local de una función dentro de otra función, debemos pasar el puntero al puntero. Al pasar el puntero al puntero, podemos cambiar el puntero para que apunte a otra cosa. Vea el siguiente programa como ejemplo.

void fun(int **pptr)
{
  static int q = 10;
  *pptr = &q;
}

int main()
{
  int r = 20;
  int *p = &r;
  fun(&p);
  printf("%d", *p);
  return 0;
}

En el ejemplo anterior, la función fun() espera un puntero doble (puntero a un puntero a un número entero). Fun() modifica el valor en la dirección pptr. El valor en la dirección pptr es el puntero p cuando pasamos la dirección de p a fun(). En fun(), el valor en pptr se cambia a la dirección de q. Por lo tanto, el puntero p de main() se cambia para que apunte a una nueva variable q.

Además, tenga en cuenta que el programa no causará ningún problema fuera del alcance porque q es una variable estática . Las variables estáticas existen en la memoria incluso después de que regresan las funciones. Para una variable automática , es posible que hayamos visto algún resultado inesperado porque es posible que la variable automática no exista en la memoria después de que regresen las funciones.

Cuestionario de esta pregunta

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 *