Понимание взаимосвязи между массивами и указателями в C
Взаимосвязь между массивами и указателями
В этом уроке вы узнаете о связи между массивами и указателями в программировании на C. Также научитесь обращаться к элементам массива с помощью указателей.
Прежде чем изучать связь между массивами и указателями, обязательно ознакомьтесь с двумя темами:
- Массивы в C
- Указатели в C
Взаимосвязь между массивами и указателями
Массив — это блок последовательных данных. Напишем программу для вывода адресов элементов массива.
#include <stdio.h>
int main() {
int x[4];
int i;
for(i = 0; i < 4; ++i) {
printf("&x[%d] = %p\n", i, &x[i]);
}
printf("Address of array x: %p", x);
return 0;
}
Вывод
&x[0] = 1450734448 &x[1] = 1450734452 &x[2] = 1450734456 &x[3] = 1450734460 Address of array 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 <stdio.h>
int main() {
int i, x[6], sum = 0;
printf("Enter 6 numbers: ");
for(i = 0; i < 6; ++i) {
// Эквивалентно scanf("%d", &x[i]);
scanf("%d", x+i);
// Эквивалентно sum += x[i]
sum += *(x+i);
}
printf("Sum = %d", sum);
return 0;
}
При запуске программы вывод будет:
Enter 6 numbers: 2 3 4 4 12 4 Sum = 29
Здесь мы объявили массив x из 6 элементов. Для доступа к элементам массива мы использовали указатели.
В большинстве контекстов имена массивов преобразуются в указатели. Простыми словами, имена массивов конвертируются в указатели. Именно поэтому вы можете использовать указатели для доступа к элементам массивов. Однако следует помнить, что указатели и массивы — это не одно и то же.
Существует несколько случаев, когда имена массивов не преобразуются в указатели. Чтобы узнать больше, посетите: When does array name doesn't decay into a pointer?
Пример 2: Массивы и указатели
#include <stdio.h>
int main() {
int x[5] = {1, 2, 3, 4, 5};
int* ptr;
// ptr получает адрес третьего элемента
ptr = &x[2];
printf("*ptr = %d \n", *ptr); // 3
printf("*(ptr+1) = %d \n", *(ptr+1)); // 4
printf("*(ptr-1) = %d", *(ptr-1)); // 2
return 0;
}
При запуске программы вывод будет:
*ptr = 3 *(ptr+1) = 4 *(ptr-1) = 2
В этом примере &x[2], адрес третьего элемента, присваивается указателю ptr. Поэтому при выводе *ptr отображается 3.
Вывод *(ptr+1) дает четвертый элемент. Аналогично, *(ptr-1) дает второй элемент.
Язык C
- Big Data и облачные вычисления: как они работают вместе
- Указатели и массивы в C++: мастерство взаимодействия
- Передача адресов и указателей в функции в C: практическое руководство
- Освоение структур и указателей в C: практическое руководство
- Понимание дисбаланса напряжения-тока в электродвигателях: причины и устранение неисправностей
- Как IoT и периферийные вычисления дополняют друг друга
- SCADA против HMI: ключевые различия и роль в Индустрии 4.0
- Двигатели постоянного и переменного тока: ключевые отличия и руководство по выбору
- Пайка (бразинг) vs Паяльник (солдеринг): ключевые отличия
- Двухтактные vs четырехтактные двигатели: ключевые отличия