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

Основы указателей

Тест проверяет адреса и разыменование без магии: нулевые и висячие указатели, const, void*, доступ к структурам и ситуации, где нужен двойной указатель для изменения состояния вызывающей стороны.

Отвечено: 0 из 20
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 20 вопросов отведено 55 минут. Код читайте построчно: часть заданий проверяет вывод, часть — поиск дефекта, переносимость и безопасное исправление. После завершения откроются объяснения и профиль по 4 темам.
Вопрос 1 из 20
Как изменится x после записи через указатель p?
CC17
#include <stdio.h>

int main(void) {
    int x = 3;
    int *p = &x;
    *p = 7;
    printf("%d\n", x);
}
Вопрос 2 из 20
Каков тип выражения `&p`, если p объявлен как `int *p`?
CC17
int *p = 0;
/* тип выражения &p */
Вопрос 3 из 20
Какое равенство гарантировано после `int *p = &x;`?
CC17
int x = 42;
int *p = &x;
Вопрос 4 из 20
Почему выражение `*&x` допустимо и чему оно соответствует?
CC17
int x = 5;
*&x = 9;
Вопрос 5 из 20
Что нужно доказать перед `*p = value`?
Вопрос 6 из 20
Что делает проверка `if (p)`?
CC17
if (p) { use(*p); }
Вопрос 7 из 20
Можно ли разыменовать нулевой указатель?
CC17
int *p = NULL;
printf("%d\n", *p);
Вопрос 8 из 20
Как лучше выразить необязательный выходной параметр?
CC17
int parse(const char *s, size_t *consumed) {
    if (consumed != NULL) *consumed = n;
    return value;
}
Вопрос 9 из 20
Что гарантирует присваивание `int *p = 0;`?
CC17
int *p = 0;
Вопрос 10 из 20
Почему проверка NULL после free не обнаруживает обращение после освобождения памяти автоматически?
CC17
free(p);
if (p != NULL) {
    use(*p);
}
Вопрос 11 из 20
Как обратиться к полю value через указатель p на struct item?
CC17
struct item { int value; };
struct item x = {7};
struct item *p = &x;
Вопрос 12 из 20
Какое преобразование выполняется неявно и обратно без потери значения для указателя на объект?
CC17
int x;
void *v = &x;
int *p = v;
Вопрос 13 из 20
Что запрещает тип `const int *p`?
CC17
const int *p = &x;
Вопрос 14 из 20
Почему приведение `double *d = (double *)&x;` с последующим чтением опасно?
CC17
int x = 0x3f800000;
double *d = (double *)&x;
printf("%f\n", *d);
Вопрос 15 из 20
Какой параметр лучше для функции, которая только читает объект config?
Вопрос 16 из 20
Какое значение получит `x` после показанного вызова `inc(&x)`?
CC17
#include <stdio.h>

static void inc(int *p) { ++*p; }

int main(void) {
    int x = 5;
    inc(&x);
    printf("%d\n", x);
}
Вопрос 17 из 20
Почему функция `reset(int *p) { p = NULL; }` не обнуляет указатель вызывающего кода?
CC17
void reset(int *p) { p = NULL; }
Вопрос 18 из 20
Какой вариант действительно может выделить память и вернуть адрес через параметр?
CВозврат выделенного адреса
int *p = NULL;
size_t n = checked_count();
if (make_buffer(&p, n) != 0) {
    handle_allocation_error();
}
Вопрос 19 из 20
Функция принимает `const char **out`. Можно ли передать ей `char **` без приведения?
CC17
void provide(const char **out);
char *p;
provide(&p); /* диагностируется */
Вопрос 20 из 20
Какой контракт наиболее устойчив для функции создания объекта?

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

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

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

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