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