Связь между массивами и указателями в программировании на C (с примерами)

В этом руководстве вы узнаете о взаимосвязи между массивами и указателями в программировании на 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)дает нам второй элемент.

Интересные статьи...