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

Има разлика от 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)ни дава втория елемент.

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