C C  ·  20 вопросов  ·  ~55 мин  ·  ⏱ Таймер 55:00  ·  Лёгкий  · 

Арифметика указателей

Тест проверяет единицы измерения указательной арифметики, ptrdiff_t, связь с массивами и строгую границу сразу за последним элементом. Здесь нельзя отвечать по числовому виду адреса — нужно опираться на объектную модель C.

Отвечено: 0 из 20
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 20 вопросов отведено 55 минут. Код читайте построчно: часть заданий проверяет вывод, часть — поиск дефекта, переносимость и безопасное исправление. После завершения откроются объяснения и профиль по 4 темам.
Вопрос 1 из 20
Какой элемент массива прочитает выражение `*(p + 2)`?
CC17
#include <stdio.h>
int main(void){ int a[]={10,20,30,40}; int *p=a; printf("%d\n", *(p+2)); }
Вопрос 2 из 20
На сколько байтов обычно изменится адрес при `p++`, если p имеет тип `struct item *`?
Вопрос 3 из 20
Как получить указатель на byte_offset байтов после начала объекта?
CСмещение в байтах
struct packet packet;
size_t byte_offset = get_offset();
/* известно: byte_offset <= sizeof packet */
Вопрос 4 из 20
Что вычисляет `&a[5] - &a[2]` для массива a?
CC17
int a[8];
ptrdiff_t d = &a[5] - &a[2];
Вопрос 5 из 20
Парсер хранит `uint32_t *p` и прибавляет к нему длину заголовка в байтах. В чём дефект?
Вопрос 6 из 20
Какой тип имеет выражение `end - begin` для двух указателей на элементы одного массива?
CC17
int *begin = a + 2;
int *end = a + 7;
/* тип end - begin */
Вопрос 7 из 20
Когда вычитание двух указателей определено?
Вопрос 8 из 20
Какую разность элементов вычислит выражение `q - p`?
CC17
#include <stddef.h>
#include <stdio.h>
int main(void){ int a[6]; int *p=&a[4], *q=&a[1]; printf("%td\n", q-p); }
Вопрос 9 из 20
Какой формат printf соответствует ptrdiff_t?
CC17
ptrdiff_t d = last - first;
printf("...\n", d);
Вопрос 10 из 20
Почему нельзя без проверки приводить разность указателей к size_t?
Вопрос 11 из 20
Какое выражение эквивалентно `a[i]`?
CC17
int value = a[i];
Вопрос 12 из 20
Допустимо ли создать указатель `int *end = a + n` для массива из n элементов?
CC17
int a[5];
int *end = a + 5;
Вопрос 13 из 20
Чем `&a` отличается от `a` для `int a[10]`?
CC17
int a[10];
/* сравните типы a и &a */
Вопрос 14 из 20
Какое значение обозначает необычная запись `2[a]`?
CC17
#include <stdio.h>
int main(void){ int a[]={1,2,3,4}; printf("%d\n", 2[a]); }
Вопрос 15 из 20
Почему `int **p = matrix` неверно для `int matrix[3][4]`?
Вопрос 16 из 20
Какое условие корректно обходит полуинтервал указателей `[first, last)`, разыменовывая только его элементы?
CC17
for (int *p=first; p<last; ++p) use(*p);
Вопрос 17 из 20
Почему условие `p <= end` опасно в этом обходе массива?
CC17
int *end = a + n;
for (int *p=a; p<=end; ++p) use(*p);
Вопрос 18 из 20
Можно ли сравнивать `<` указатели на два независимых malloc-блока для определения, какой “раньше”?
Вопрос 19 из 20
Как безопасно проверить, что осталось не меньше need элементов?
CC17
/* p и end относятся к одному массиву */
if (/* достаточно элементов */) { ... }
Вопрос 20 из 20
Какой указатель стандарт C разрешает получить арифметикой внутри массива, хотя разыменовывать результат нельзя?

Ответьте на все 20 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу