В этом руководстве вы узнаете о взаимосвязи между массивами и указателями в программировании на C. Вы также научитесь получать доступ к элементам массива с помощью указателей.
Прежде чем вы узнаете о взаимосвязи между массивами и указателями, обязательно ознакомьтесь с этими двумя темами:
- Массивы C
- Указатели C
Связь между массивами и указателями
Массив - это блок последовательных данных. Напишем программу для вывода адресов элементов массива.
#include int main() ( int x(4); int i; for(i = 0; i < 4; ++i) ( printf("&x(%d) = %p", i, &x(i)); ) printf("Address of array x: %p", x); return 0; )
Вывод
& x (0) = 1450734448 & x (1) = 1450734452 & x (2) = 1450734456 & x (3) = 1450734460 Адрес массива x: 1450734448
Между двумя последовательными элементами массива x разница в 4 байта. Это потому, что размер int
составляет 4 байта (в нашем компиляторе).
Обратите внимание, что адреса & x (0) и x совпадают. Это потому, что имя переменной x указывает на первый элемент массива.
Из приведенного выше примера ясно, что &x(0)
это эквивалентно x. И x(0)
эквивалентно *x
.
Так же,
&x(1)
эквивалентноx+1
иx(1)
эквивалентно*(x+1)
.&x(2)
эквивалентноx+2
иx(2)
эквивалентно*(x+2)
.- …
- По сути,
&x(i)
эквивалентноx+i
иx(i)
эквивалентно*(x+i)
.
Пример 1: указатели и массивы
#include int main() ( int i, x(6), sum = 0; printf("Enter 6 numbers: "); for(i = 0; i < 6; ++i) ( // Equivalent to scanf("%d", &x(i)); scanf("%d", x+i); // Equivalent to sum += x(i) sum += *(x+i); ) printf("Sum = %d", sum); return 0; )
Когда вы запустите программу, вывод будет:
Введите 6 чисел: 2 3 4 4 12 4 Сумма = 29
Здесь мы объявили массив x из 6 элементов. Для доступа к элементам массива мы использовали указатели.
В большинстве случаев имена массивов превращаются в указатели. Проще говоря, имена массивов преобразуются в указатели. Вот почему вы можете использовать указатели для доступа к элементам массивов. Однако следует помнить, что указатели и массивы - это не одно и то же .
Есть несколько случаев, когда имена массивов не превращаются в указатели. Чтобы узнать больше, посетите: Когда имя массива не превращается в указатель?
Пример 2: массивы и указатели
#include int main() ( int x(5) = (1, 2, 3, 4, 5); int* ptr; // ptr is assigned the address of the third element ptr = &x(2); printf("*ptr = %d ", *ptr); // 3 printf("*(ptr+1) = %d ", *(ptr+1)); // 4 printf("*(ptr-1) = %d", *(ptr-1)); // 2 return 0; )
Когда вы запустите программу, вывод будет:
* ptr = 3 * (ptr + 1) = 4 * (ptr-1) = 2
В этом примере &x(2)
адрес третьего элемента присваивается указателю ptr. Следовательно, 3
при печати отображалось *ptr
.
И печать *(ptr+1)
дает нам четвертый элемент. Точно так же печать *(ptr-1)
дает нам второй элемент.