Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> Язык 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 указывает на первый элемент массива.

Понимание взаимосвязи между массивами и указателями в C

Из приведенного выше примера видно, что &x[0] эквивалентно x. А x[0] эквивалентно *x.

Аналогично:


Пример 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

  1. Big Data и облачные вычисления: как они работают вместе
  2. Указатели и массивы в C++: мастерство взаимодействия
  3. Передача адресов и указателей в функции в C: практическое руководство
  4. Освоение структур и указателей в C: практическое руководство
  5. Понимание дисбаланса напряжения-тока в электродвигателях: причины и устранение неисправностей
  6. Как IoT и периферийные вычисления дополняют друг друга
  7. SCADA против HMI: ключевые различия и роль в Индустрии 4.0
  8. Двигатели постоянного и переменного тока: ключевые отличия и руководство по выбору
  9. Пайка (бразинг) vs Паяльник (солдеринг): ключевые отличия
  10. Двухтактные vs четырехтактные двигатели: ключевые отличия