Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π·Ρ‹ΠΊ программирования Π‘ΠΈ. ИзданиС 3-Π΅, исправлСнноС». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 28

Автор Π‘Ρ€Π°ΠΉΠ°Π½ ΠšΠ΅Ρ€Π½ΠΈΠ³Π°Π½

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 5.1. Ѐункция getint написана Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ Π·Π½Π°ΠΊΠΈ - ΠΈΠ»ΠΈ +, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π½Π΅ слСдуСт Ρ†ΠΈΡ„Ρ€Π°, ΠΎΠ½Π° ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΊΠ°ΠΊ "ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅" прСдставлСниС нуля. Π‘ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… случаях ΠΎΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π»Π° ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½Π½Ρ‹ΠΉ Π·Π½Π°ΠΊ Π½Π°Π·Π°Π΄ Π²ΠΎ Π²Π²ΠΎΠ΄.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 5.2. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ getfloat - Π°Π½Π°Π»ΠΎΠ³ getint для чисСл с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ. Какой Ρ‚ΠΈΠΏ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π·Π°Π΄Π°Π²Π°Π΅ΠΌΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ getfloat?

5.3 Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΈ массивы

Π’ Π‘ΠΈ сущСствуСт связь ΠΌΠ΅ΠΆΠ΄Ρƒ указатСлями ΠΈ массивами, ΠΈ связь эта Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ тСсная, Ρ‡Ρ‚ΠΎ эти срСдства Π»ΡƒΡ‡ΡˆΠ΅ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ вмСстС. Π›ΡŽΠ±ΠΎΠΉ доступ ΠΊ элСмСнту массива, осущСствляСмый ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ индСксирования, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ указатСля. Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ с указатСлями Π² ΠΎΠ±Ρ‰Π΅ΠΌ случаС Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ быстрСС, Π½ΠΎ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π² Π½Π΅ΠΌ, особСнно нСпосвящСнному, довольно Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ.

ОбъявлСниС

int a[10];

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅Ρ‚ массив a Ρ€Π°Π·ΠΌΠ΅Ρ€Π° 10, Ρ‚. Π΅. Π±Π»ΠΎΠΊ ΠΈΠ· 10 ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ a[0], a[1],…, a[9].

Π—Π°ΠΏΠΈΡΡŒ a[i] отсылаСт нас ΠΊ i-ΠΌΡƒ элСмСнту массива. Если pa Π΅ΡΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° int, Ρ‚. Π΅. объявлСн ΠΊΠ°ΠΊ

int *pa;

Ρ‚ΠΎ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ присваивания

pa =&a[0];

pa Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° Π½ΡƒΠ»Π΅Π²ΠΎΠΉ элСмСнт a, ΠΈΠ½Π°Ρ‡Π΅ говоря, pa Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ адрСс элСмСнта a[0].

Π’Π΅ΠΏΠ΅Ρ€ΡŒ присваиваниС

x = *pa;

Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ содСрТимоС a[0] Π² x.

Если pa ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ элСмСнт массива, Ρ‚ΠΎ pa+1 ΠΏΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ элСмСнт, pa+i - Π½Π° i-ΠΉ элСмСнт послС pa, a pa-i - Π½Π° i-ΠΉ элСмСнт ΠΏΠ΅Ρ€Π΅Π΄ pa. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ссли pa ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° a[0], Ρ‚ΠΎ

*(pa+1)

Π΅ΡΡ‚ΡŒ содСрТимоС a[1], a+i - адрСс a[i], a *(pa+i) - содСрТимоС a[i].

Π‘Π΄Π΅Π»Π°Π½Π½Ρ‹Π΅ замСчания Π²Π΅Ρ€Π½Ρ‹ Π±Π΅Π·ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊ Ρ‚ΠΈΠΏΡƒ ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ элСмСнтов массива a. Бмысл слов "Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ 1 ΠΊ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ", ΠΊΠ°ΠΊ ΠΈ смысл любой Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΠΊΠΈ с указатСлями, состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ pa+1 ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π» Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, a pa+i - Π½Π° i-ΠΉ послС pa.

ΠœΠ΅ΠΆΠ΄Ρƒ индСксированиСм ΠΈ Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΠΊΠΎΠΉ с указатСлями сущСствуСт ΠΎΡ‡Π΅Π½ΡŒ тСсная связь. По ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ»ΠΈ выраТСния Ρ‚ΠΈΠΏΠ° массив Π΅ΡΡ‚ΡŒ адрСс Π½ΡƒΠ»Π΅Π²ΠΎΠ³ΠΎ элСмСнта массива. ПослС присваивания

pa =&a[0];

Ρ€Π° ΠΈ a ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ имя массива являСтся синонимом располоТСния Π΅Π³ΠΎ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ элСмСнта, присваиваниС pa=&a[0] ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Π²ΠΈΠ΄Π΅:

pa = a;

Π•Ρ‰Π΅ Π±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ (ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд) Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ a[i] ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠ°ΠΊ *(a+i). Вычисляя a[i], Π‘ΠΈ сразу ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ Π΅Π³ΠΎ Π² *(a+i); ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π΄Π²Π΅ Ρ„ΠΎΡ€ΠΌΡ‹ записи эквивалСнтны. Из этого слСдуСт, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ примСнСния ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° & записи &a[i] ΠΈ a+i Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄ΡƒΡ‚ эквивалСнтными, Ρ‚. Π΅. ΠΈ Π² Ρ‚ΠΎΠΌ ΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ случаС это адрСс i-Π³ΠΎ элСмСнта послС a. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Ссли pa - ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, Ρ‚ΠΎ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ с индСксом, Ρ‚. Π΅. запись pa[i] эквивалСнтна записи *(pa+i). ΠšΠΎΡ€ΠΎΡ‡Π΅ говоря, элСмСнт массива ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ ΠΊΠ°ΠΊ Π² Π²ΠΈΠ΄Π΅ указатСля со смСщСниСм, Ρ‚Π°ΠΊ ΠΈ Π² Π²ΠΈΠ΄Π΅ ΠΈΠΌΠ΅Π½ΠΈ массива с индСксом.

ΠœΠ΅ΠΆΠ΄Ρƒ ΠΈΠΌΠ΅Π½Π΅ΠΌ массива ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ, Π²Ρ‹ΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰ΠΈΠΌ Π² Ρ€ΠΎΠ»ΠΈ ΠΈΠΌΠ΅Π½ΠΈ массива, сущСствуСт ΠΎΠ΄Π½ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅. Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ - это пСрСмСнная, поэтому ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ pa=a ΠΈΠ»ΠΈ pa++. Но имя массива Π½Π΅ являСтся ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΈ записи Π²Ρ€ΠΎΠ΄Π΅ a=pa ΠΈΠ»ΠΈ a++ Π½Π΅ Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ.

Если имя массива пСрСдаСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚ΠΎ послСдняя ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° адрСс Π΅Π³ΠΎ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ элСмСнта. Π’Π½ΡƒΡ‚Ρ€ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ этот Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ являСтся локальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, содСрТащСй адрСс. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½Π½Ρ‹ΠΌ Ρ„Π°ΠΊΡ‚ΠΎΠΌ ΠΈ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄Π½Ρƒ Π²Π΅Ρ€ΡΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ strlen, Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‰Π΅ΠΉ Π΄Π»ΠΈΠ½Ρƒ строки.

/* strlen: Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΄Π»ΠΈΠ½Ρƒ строки */

int strlen(char *s)

{

 int n;

 for (n = 0; *s!= '\0'; s++)

  n++;

 return n;

}

Π’Π°ΠΊ ΠΊΠ°ΠΊ пСрСмСнная s - ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, ΠΊ Π½Π΅ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠ° опСрация ++; s++ Π½Π΅ ΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ влияния Π½Π° строку символов Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая ΠΎΠ±Ρ€Π°Ρ‚ΠΈΠ»Π°ΡΡŒ ΠΊ strlen. ΠŸΡ€ΠΎΡΡ‚ΠΎ увСличиваСтся Π½Π° 1 нСкоторая копия указатСля, находящаяся Π² Π»ΠΈΡ‡Π½ΠΎΠΌ пользовании Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ strlen. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ всС Π²Ρ‹Π·ΠΎΠ²Ρ‹, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ:

strlen("3дравствуй, ΠΌΠΈΡ€"); /* строковая константа */

strlen(array); /* char array[100]; */

strlen(ptr); /* char *ptr; */

ΠΏΡ€Π°Π²ΠΎΠΌΠ΅Ρ€Π½Ρ‹.

Π€ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹

char s[];

ΠΈ

char *s;

Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ эквивалСнтны. ΠœΡ‹ ΠΎΡ‚Π΄Π°Π΅ΠΌ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚Π΅Π½ΠΈΠ΅ послСднСму Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρƒ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ Π±ΠΎΠ»Π΅Π΅ явно сообщаСт, Ρ‡Ρ‚ΠΎ s Π΅ΡΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ. Если Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° пСрСдаСтся имя массива, Ρ‚ΠΎ ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Π΅ΠΉ ΡƒΠ΄ΠΎΠ±Π½ΠΎ - Π»ΠΈΠ±ΠΎ ΠΊΠ°ΠΊ имя массива, Π»ΠΈΠ±ΠΎ ΠΊΠ°ΠΊ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, ΠΈ ΠΏΠΎΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ с Π½ΠΈΠΌ соотвСтствСнно. Она ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π°ΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Π° Π²ΠΈΠ΄Π° записи, Ссли это покаТСтся умСстным ΠΈ понятным.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒ массива, для этого Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° Π½Π°Ρ‡Π°Π»ΠΎ подмассива. НапримСр, Ссли a - массив, Ρ‚ΠΎ Π² записях

f(&a[2])

ΠΈΠ»ΠΈ

f(a+2)

Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ f пСрСдаСтся адрСс подмассива, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰Π΅Π³ΠΎΡΡ с элСмСнта a[2]. Π’Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ f описаниС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΊΠ°ΠΊ

f(int arr[]) {…}

ΠΈΠ»ΠΈ

f(int *arr) {…}

Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, для f Ρ‚ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‡Π°ΡΡ‚ΡŒ массива, Π° Π½Π΅ Π½Π° вСсь массив, Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ значСния.

Если Π΅ΡΡ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Π½ΠΎΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ элСмСнты массива ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚, Ρ‚ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ индСксированиС ΠΈ Π² "ΠΎΠ±Ρ€Π°Ρ‚Π½ΡƒΡŽ" сторону ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ Π½ΡƒΠ»Π΅Π²ΠΎΠΌΡƒ элСмСнту; выраТСния p[-1], p[-2] ΠΈ Ρ‚.Π΄. Π½Π΅ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΡ€Π΅Ρ‡Π°Ρ‚ синтаксису языка ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ ΠΊ элСмСнтам, стоящим нСпосрСдствСнно ΠΏΠ΅Ρ€Π΅Π΄ p[0]. РазумССтся, нСльзя "Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ" Π·Π° Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ массива ΠΈ Ρ‚Π΅ΠΌ самым ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ Π½Π΅ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ.

5.4 АдрСсная Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΠΊΠ°

Если p Π΅ΡΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ элСмСнт массива, Ρ‚ΠΎ p++ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ p Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π» Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ элСмСнт, Π° p+=i ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Π΅Π³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π» Π½Π° i-ΠΉ элСмСнт послС Ρ‚ΠΎΠ³ΠΎ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π» Ρ€Π°Π½Π΅Π΅. Π­Ρ‚ΠΈ ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ конструкции - самыС простыС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΠΊΠΈ Π½Π°Π΄ указатСлями, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ Ρ‚Π°ΠΊΠΆΠ΅ адрСсной Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΠΊΠΎΠΉ.

Π‘ΠΈ послСдоватСлСн ΠΈ Π΅Π΄ΠΈΠ½ΠΎΠΎΠ±Ρ€Π°Π·Π΅Π½ Π² своСм ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ ΠΊ адрСсной Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΠΊΠ΅. Π­Ρ‚ΠΎ соСдинСниС Π² ΠΎΠ΄Π½ΠΎΠΌ языкС ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ, массивов ΠΈ адрСсной Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΠΊΠΈ - ΠΎΠ΄Π½Π° ΠΈΠ· ΡΠΈΠ»ΡŒΠ½Ρ‹Ρ… Π΅Π³ΠΎ сторон. ΠŸΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ сказанноС построСниСм простого распрСдСлитСля памяти, состоящСго ΠΈΠ· Π΄Π²ΡƒΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. ΠŸΠ΅Ρ€Π²Π°Ρ, alloc(n), Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ p Π½Π° n ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ располоТСнных ячССк Ρ‚ΠΈΠΏΠ° char; ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ, ΠΎΠ±Ρ€Π°Ρ‰Π°ΡŽΡ‰Π΅ΠΉΡΡ ΠΊ alloc, эти ячСйки ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ для запоминания символов. Вторая, afree(p), освобоТдаСт ΠΏΠ°ΠΌΡΡ‚ΡŒ для, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΉ Π΅Π΅ ΡƒΡ‚ΠΈΠ»ΠΈΠ·Π°Ρ†ΠΈΠΈ. ΠŸΡ€ΠΎΡΡ‚ΠΎΡ‚Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° обусловлСна ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ обращСния ΠΊ afree Π΄Π΅Π»Π°ΡŽΡ‚ΡΡ Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ обращСниям ΠΊ alloc. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΏΠ°ΠΌΡΡ‚ΡŒ, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ alloc ΠΈ afree, являСтся стСком (списком, Π² основС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π»Π΅ΠΆΠΈΡ‚ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ "послСдним вошСл, ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΡƒΡˆΠ΅Π»"). Π’ стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ malloc ΠΈ free, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π΅Π»Π°ΡŽΡ‚ Ρ‚ΠΎ ΠΆΠ΅ самоС, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π±Π΅Π· упомянутых ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ: Π² ΠΏΠ°Ρ€Π°Π³Ρ€Π°Ρ„Π΅ 8.7 ΠΌΡ‹ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ выглядят.

Π€ΡƒΠ½ΠΊΡ†ΠΈΡŽ alloc Π»Π΅Π³Ρ‡Π΅ всСго Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Ссли ΡƒΡΠ»ΠΎΠ²ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π΄Π°Π²Π°Ρ‚ΡŒ куски Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ большого массива Ρ‚ΠΈΠΏΠ° char, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Π½Π°Π·ΠΎΠ²Π΅ΠΌ allocbuf. Π­Ρ‚ΠΎΡ‚ массив ΠΎΡ‚Π΄Π°Π΄ΠΈΠΌ Π² Π»ΠΈΡ‡Π½ΠΎΠ΅ пользованиС функциям alloc ΠΈ afree. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ Π΄Π΅Π»ΠΎ с указатСлями, Π° Π½Π΅ с индСксами массива, Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌ Π·Π½Π°Ρ‚ΡŒ Π΅Π³ΠΎ имя Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, этот массив ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ исходном Ρ„Π°ΠΉΠ»Π΅, Ρ‡Ρ‚ΠΎ ΠΈ alloc ΠΈ afree, объявив Π΅Π³ΠΎ static, благодаря Ρ‡Π΅ΠΌΡƒ ΠΎΠ½ станСт Π½Π΅Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌ Π²Π½Π΅ этого Ρ„Π°ΠΉΠ»Π°. На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ Ρ‚Π°ΠΊΠΎΠΉ массив ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈ вовсС Π½Π΅ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΈΠΌΠ΅Π½ΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ malloc Ρƒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ бСзымянный Π±Π»ΠΎΠΊ памяти.

ЕстСствСнно, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ, сколько элСмСнтов массива allocbuf ΡƒΠΆΠ΅ занято. ΠœΡ‹ Π²Π²Π΅Π΄Π΅ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ allocp, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ свободный элСмСнт. Если Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ΡΡ ΠΏΠ°ΠΌΡΡ‚ΡŒ для n символов, Ρ‚ΠΎ alloc Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ allocp (Ρ‚. Π΅. адрСс Π½Π°Ρ‡Π°Π»Π° свободного Π±Π»ΠΎΠΊΠ°) ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Π΅Π³ΠΎ Π½Π° n, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ allocp ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π» Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ. Если ΠΆΠ΅ пространства Π½Π΅Ρ‚, Ρ‚ΠΎ alloc Π²Ρ‹Π΄Π°Π΅Ρ‚ Π½ΡƒΠ»ΡŒ. Ѐункция afree(p) просто устанавливаСт allocp Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ p, Ссли ΠΎΠ½ΠΎ Π½Π΅ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ массива allocbuf.