Salida de programas en C | conjunto 12

Prediga la salida de los siguientes programas.

Pregunta 1

int fun(char *str1)
{
  char *str2 = str1;
  while(*++str1);
  return (str1-str2);
}    
  
int main()
{
  char *str = "geeksforgeeks";
  printf("%d", fun(str));
  getchar();
  return 0;
}

Salida: 13
Dentro de fun(), el puntero str2 se inicializa como str1 y str1 se mueve hasta que se alcanza ‘\0’ (nota ; después del ciclo while). Entonces, str1 se incrementará en 13 (suponiendo que char tome 1 byte).

Pregunta 2

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

Salida: 20
Inside fun(), q es una copia del puntero p. Entonces, si cambiamos q para señalar otra cosa, entonces p no se ve afectado.

Pregunta 3

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

Salida 10

Tenga en cuenta que estamos pasando la dirección de p a fun(). p en fun() es en realidad un puntero a p en main() y estamos cambiando el valor en p en fun(). Entonces p de main se cambia al punto q de fun(). Para entenderlo mejor, cambiemos el nombre de p en fun() a p_ref o ptr_to_p

void fun(int **ptr_to_p)
{
  static int q = 10;
  *ptr_to_p = &q;  /*Now p of main is pointing to q*/
}

Además, tenga en cuenta que el programa no causará ningún problema 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 un resultado extraño porque la variable automática puede no existir en la memoria después de que regresan las funciones.

Escriba comentarios si encuentra que alguna de las respuestas/explicaciones es incorrecta, o si desea compartir más información sobre los temas discutidos 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 *