Связь между массивами и указателями
Связь между массивами и указателями
В этом руководстве вы узнаете о связи между массивами и указателями в программировании на 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
Разница в 4 байта между двумя последовательными элементами массива x . Это потому, что размер 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) {
// Equivalent to scanf("%d", &x[i]);
scanf("%d", x+i);
// Equivalent to 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 элементов. Для доступа к элементам массива мы использовали указатели.
<час>В большинстве случаев имена массивов превращаются в указатели. Проще говоря, имена массивов преобразуются в указатели. Вот почему вы можете использовать указатели для доступа к элементам массивов. Однако следует помнить, что указатели и массивы — это не одно и то же. .
Есть несколько случаев, когда имена массивов не распадаются на указатели. Чтобы узнать больше, посетите:Когда имя массива не распадается на указатель?
<час>Пример 2:Массивы и указатели
#include <stdio.h>
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 \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 указатель. Следовательно, 3
отображалось, когда мы печатали *ptr
.
И, печатая *(ptr+1)
дает нам четвертый элемент. Аналогично, печать *(ptr-1)
дает нам второй элемент.
Язык C
- Какая связь между большими данными и облачными вычислениями?
- Указатели и массивы C++
- C Pass адреса и указатели
- C-структуры и указатели
- Соотношение между напряжением и током в электродвигателях
- Взаимосвязь между IoT и граничными вычислениями
- Различия между SCADA и HMI
- Разница между двигателями постоянного и переменного тока
- Разница между пайкой и пайкой
- Разница между 2-тактным и 4-тактным двигателями