Рубрики

Выход программы C | Набор 24

Прогнозировать вывод следующих программ на C:

Уровень сложности: Новичок

Вопрос 1

#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;

}

Выход:

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

В C имя массива дает адрес первого элемента в массиве. Поэтому, когда мы делаем ptr1 = arr, ptr1 начинает указывать на адрес первого элемента arr. Поскольку элементы массива доступны с помощью арифметики указателей, arr + 5 является допустимым выражением и дает адрес 6-го элемента. Предсказать значение ptr2 — ptr1 несложно, оно дает 5, поскольку между этими двумя адресами есть 5 разобщителей. Когда мы делаем (char *) ptr2, ptr2 типизируется в указатель char. В выражении «(int *) ptr2 — (int *) ptr1», арифметика указателя происходит с учетом символьных указателей. Поскольку размер символа составляет один байт, мы получаем 5 * sizeof (int) (что равно 20) как разность двух указателей.
В качестве упражнения, предсказать вывод следующей программы.

#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;

}

вопрос 2

#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;

}

Выход:

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

Давайте сначала поговорим о первом выводе «arr = geeks» . Когда% s используется для печати строки, printf начинается с первого символа по указанному адресу и продолжает печатать символы, пока не увидит символ завершения строки, поэтому мы получаем «arr = geeks», так как после geeks в arr [есть / 0 ].
Теперь поговорим о выводе «sizeof (arr) = 17» . Когда массив символов инициализируется строкой в двойных кавычках и размер массива не указан, компилятор автоматически выделяет один дополнительный пробел для ограничителя строки '/ 0' (см. Этот Gfact ), поэтому размер arr равен 17.
Объяснение для печати «str = geeks» такое же, как и для печати «arr = geeks». Говоря о значении sizeof (str), str это просто указатель (не массив), поэтому мы получаем размер указателя в качестве вывода.

Пожалуйста, напишите комментарии, если вы нашли выше ответ / объяснение неверно, или вы хотите поделиться дополнительной информацией по теме, обсужденной выше

Рекомендуемые посты:

Выход программы C | Набор 24

0.00 (0%) 0 votes