Online C Compiler
Открыть в компиляторе

Учебная версия на русском. Код и его вывод сохранены в исходном виде.

Указатели в C

Научитесь получать адреса, разыменовывать указатели и соблюдать границы и время жизни объектов.

Открыть в компиляторе

Указатели в C
Научитесь получать адреса, разыменовывать указатели и соблюдать границы и время жизни объектов.

Указатель хранит адрес и связан с определённым типом. Оператор & получает адрес объекта, а * обращается к объекту по указателю. Перед разыменованием проверьте, что объект существует и имеет подходящий тип.

Арифметика указателей перемещает адрес в единицах размера указанного типа. Можно сформировать указатель на позицию сразу после массива, но нельзя разыменовывать его. Вычитание и сравнение порядка указателей должны соблюдать правила для одного массива.

Передача указателя копирует его значение. Через копию можно изменить исходный объект, но изменение самой копии не изменит указатель вызывающего кода. Чтобы обновить его, верните новый указатель или передайте указатель на указатель.

Инициализируйте указатели, проверяйте выделение памяти и не обращайтесь к ней после free. Рисунок объектов и стрелок помогает разобраться в списках и массивах указателей.

Код C

#include <stdio.h>
#include <stdlib.h>

void swap(int *a, int *b) {
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

int main(void) {
    int score = 95;
    int *ptr = &score;

    printf("Value via ptr : %d\n", *ptr);
    *ptr = 100;
    printf("Updated score : %d\n", score);

    int nums[4] = {10, 20, 30, 40};
    int *p = nums;
    for (int i = 0; i < 4; i++) {
        printf("*(p + %d) = %d\n", i, *(p + i));
    }
    printf("Bytes between p and p + 1: %zu\n",
           (size_t)((char *)(p + 1) - (char *)p));

    int x = 1, y = 2;
    swap(&x, &y);
    printf("After swap: x = %d, y = %d\n", x, y);

    int *heap = malloc(3 * sizeof(int));
    if (heap == NULL) {
        return 1;
    }
    for (int i = 0; i < 3; i++) {
        heap[i] = (i + 1) * 5;
    }
    printf("Heap values: %d %d %d\n", heap[0], heap[1], heap[2]);
    free(heap);
    heap = NULL;
    printf("heap is %s after free\n", heap == NULL ? "NULL" : "not NULL");
    return 0;
}
Открыть в компиляторе

Ожидаемый вывод

Value via ptr : 95
Updated score : 100
*(p + 0) = 10
*(p + 1) = 20
*(p + 2) = 30
*(p + 3) = 40
Bytes between p and p + 1: 4
After swap: x = 2, y = 1
Heap values: 5 10 15
heap is NULL after free

Частые вопросы

Почему код и вывод остаются на английском?

Ключевые слова, идентификаторы и строки, проверяемые тестами, сохранены, чтобы не менять программу. Объяснения и элементы управления переведены.