Salida del programa C | Conjunto 24

Prediga la salida de los siguientes programas en C:
Nivel de dificultad: 
Pregunta de novato 1 
 

C

#include<stdio.h>
int main()
{
    int arr[] = {10, 20, 30, 40, 50, 60};
    int *ptr1 = arr;
    int *ptr2 = arr + 5;
    printf ("ptr2 - ptr1 = %d\n", ptr2 - ptr1);
    printf ("(char*)ptr2 - (char*) ptr1 = %d",  (char*)ptr2 - (char*)ptr1);
    getchar();
    return 0;
}

Producción: 
 

  ptr2 - ptr1 = 5
  (char*)ptr2 - (char*) ptr1 = 20

En C, el nombre de la array da la dirección del primer elemento de la array. Entonces, cuando hacemos ptr1 = arr, ptr1 comienza a apuntar a la dirección del primer elemento de arr. Dado que se accede a los elementos de la array mediante la aritmética de punteros, arr + 5 es una expresión válida y proporciona la dirección del sexto elemento. Predecir el valor ptr2 – ptr1 es fácil, da 5 ya que hay 5 enteros entre estas dos direcciones. Cuando hacemos (char *) ptr2, ptr2 se encasilla en el puntero char. En la expresión “(int*)ptr2 – (int*)ptr1”, la aritmética de punteros ocurre considerando los punteros de caracteres. Dado que el tamaño de un carácter es un byte, obtenemos 5*sizeof(int) (que es 20) como diferencia de dos punteros. 
Como ejercicio, prediga la salida del siguiente programa. 
 

C

#include<stdio.h>
int main()
{
    char arr[] = "geeksforgeeks";
    char *ptr1 = arr;
    char *ptr2 = ptr1 + 3;
    printf ("ptr2 - ptr1 = %d\n", ptr2 - ptr1);
    printf ("(int*)ptr2 - (int*) ptr1 = %d",  (int*)ptr2 - (int*)ptr1);
    getchar();
    return 0;
}

Pregunta 2
 

C

#include<stdio.h>
 
int main()
{
  char arr[] = "geeks\0 for geeks";
  char *str = "geeks\0 for geeks";
  printf ("arr = %s, sizeof(arr) = %d \n", arr, sizeof(arr));
  printf ("str = %s, sizeof(str) = %d", str, sizeof(str));
  getchar();
  return 0;
}

Producción: 
 

  arr = geeks, sizeof(arr) = 17
  str = geeks, sizeof(str) = 4

Hablemos primero de la primera salida “arr = geeks” . Cuando se usa %s para imprimir una string, printf comienza desde el primer carácter en la dirección dada y continúa imprimiendo caracteres hasta que ve un carácter de terminación de string, por lo que obtenemos «arr = geeks» ya que hay un \0 después de geeks en arr[ ]. 
Ahora hablemos de la salida «sizeof(arr) = 17» . Cuando una array de caracteres se inicializa con una string entre comillas dobles y no se especifica el tamaño de la array, el compilador asigna automáticamente un espacio adicional para el terminador de string ‘\0’ (consulte este Gfact ), es por eso que el tamaño de arr es 17. 
La explicación para imprimir «str = geeks» es la misma que para imprimir «arr = geeks». Hablando sobre el valor de sizeof (str), str es solo un puntero (no una array), por lo que obtenemos el tamaño de un puntero como salida (que también puede ser igual a 8 en caso de que esté utilizando una máquina de 64 bits).
Escriba comentarios si encuentra que la respuesta/explicación anterior es incorrecta, o si desea compartir más información sobre el tema tratado 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 *