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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π·Ρ‹ΠΊ Π‘ΠΈ - руководство для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ…Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 67

Автор M. УЭИВ

     ΠΠ²Ρ‚оматичСскиС ΠΈ рСгистровыС массивы ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ нСльзя.

     ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ массив, Π΄Π°Π²Π°ΠΉΡ‚Π΅ посмотрим, Ρ‡Ρ‚o Ρ‚Π°ΠΌ находится, Ссли ΠΌΡ‹ Π² Π½Π΅Π³ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ записали.

/* ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° содСрТимого массива */

main( ) {

int fuzzy[2]; /*автоматичСский массив */

static int wuzzy[2]; /* статичСский массив */

printf("%d %d\n", fuzzy[1], wuzzy[1];

}

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚

525 0

     ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ:

Если Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π·Π°ΡΡ‹Π»Π°Ρ‚ΡŒ Π² массив ΠΏΠ΅Ρ€Π΅Π΄ Π½Π°Ρ‡Π°Π»ΠΎΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½ΠΈΠΌ, Ρ‚ΠΎ внСшниС ΠΈ статичСскиС массивы ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π½ΡƒΠ»Π΅ΠΌ, Π° автоматичСскиС ΠΈ статичСскиС массивы содСрТат ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ "мусор", ΠΎΡΡ‚Π°Π²ΡˆΠΈΠΉΡΡ Π² этой частя памяти.

     ΠŸΡ€Π΅ΠΊΡ€Π°ΡΠ½ΠΎ! Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ для обнулСния статичСского ΠΈΠ»ΠΈ внСшнСго массива - просто Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π΄Π΅Π»Π°Ρ‚ΡŒ. Но ΠΊΠ°ΠΊ Π±Ρ‹Ρ‚ΡŒ, Ссли Π½Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ значСния, ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΎΡ‚ нуля, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ количСство Π΄Π½Π΅ΠΉ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ мСсяцС. Π’ этом случаС ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ:

/* Π΄Π½ΠΈ мСсяца */

int days[12]=[31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

main( )

{

int index;

extern int days[ ]; /* Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ описаниС */

for(index = 0; index < 12; index++)

printf(" ΠœΠ΅ΡΡΡ† %d ΠΈΠΌΠ΅Π΅Ρ‚ %d Π΄Π½Π΅ΠΉ.\n", index + 1, days[index]);

}

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

ΠœΠ΅ΡΡΡ† 1 ΠΈΠΌΠ΅Π΅Ρ‚ 31 Π΄Π½Π΅ΠΉ. ΠœΠ΅ΡΡΡ† 2 ΠΈΠΌΠ΅Π΅Ρ‚ 28 Π΄Π½Π΅ΠΉ. ΠœΠ΅ΡΡΡ† 3 ΠΈΠΌΠ΅Π΅Ρ‚ 31 Π΄Π½Π΅ΠΉ.

ΠœΠ΅ΡΡΡ† 4 ΠΈΠΌΠ΅Π΅Ρ‚ 30 Π΄Π½Π΅ΠΉ. ΠœΠ΅ΡΡΡ† 5 ΠΈΠΌΠ΅Π΅Ρ‚ 31 Π΄Π½Π΅ΠΉ. ΠœΠ΅ΡΡΡ† 6 ΠΈΠΌΠ΅Π΅Ρ‚ 30 Π΄Π½Π΅ΠΉ.

ΠœΠ΅ΡΡΡ† 7 ΠΈΠΌΠ΅Π΅Ρ‚ 31 Π΄Π½Π΅ΠΉ. ΠœΠ΅ΡΡΡ† 8 ΠΈΠΌΠ΅Π΅Ρ‚ 31 Π΄Π½Π΅ΠΉ. ΠœΠ΅ΡΡΡ† 9 ΠΈΠΌΠ΅Π΅Ρ‚ 30 Π΄Π½Π΅ΠΉ.

ΠœΠ΅ΡΡΡ† 10  ΠΈΠΌΠ΅Π΅Ρ‚ 31 Π΄Π½Π΅ΠΉ. ΠœΠ΅ΡΡΡ† 11 ΠΈΠΌΠ΅Π΅Ρ‚ 30 Π΄Π½Π΅ΠΉ. ΠœΠ΅ΡΡΡ† 12 ΠΈΠΌΠ΅Π΅Ρ‚ 31 Π΄Π½Π΅ΠΉ.

     ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ совсСм ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Π°, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½Π° Π²Ρ‹Π΄Π°Π΅Ρ‚ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ для Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ мСсяца ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚ΠΎΠ³ΠΎ Π³ΠΎΠ΄Π°.

     ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ² массив days[ ] Π²Π½Π΅ Ρ‚Π΅Π»Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΌΡ‹ Ρ‚Π΅ΠΌ самым сдСлали Π΅Π³ΠΎ внСшним. ΠœΡ‹ ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Π»ΠΈ Π΅Π³ΠΎ списком, Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΌ Π² скобки, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΡ€ΠΈ этом запятыС для раздСлСния элСмСнтов списка.

     ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ элСмСнтов Π² спискС Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ массива. А Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚, Ссли ΠΌΡ‹ ошиблись Π² подсчСтС? ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ послСдний ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ список, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΊΠΎΡ€ΠΎΡ‡Π΅, Ρ‡Π΅ΠΌ Π½ΡƒΠΆΠ½ΠΎ (Π½Π° Π΄Π²Π° элСмСнта):

/* Π΄Π½ΠΈ мСсяца */

int days[12]=[31, 28, 31, 30, 31, 30, 31, 31, 30, 31];

main( )

{

int index;

extern int days[  ]; /* Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ описаниС */

for(index = 0; index < 12; index++)

printf(" ΠœΠ΅ΡΡΡ† %d ΠΈΠΌΠ΅Π΅Ρ‚ %d Π΄Π½Π΅ΠΉ.\n", index + 1, days[index]);

}

Π’ этом случаС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ оказываСтся ΠΈΠ½Ρ‹ΠΌ:

ΠœΠ΅ΡΡΡ† 1 ΠΈΠΌΠ΅Π΅Ρ‚ 31 Π΄Π½Π΅ΠΉ.

ΠœΠ΅ΡΡΡ† 2 ΠΈΠΌΠ΅Π΅Ρ‚ 28 Π΄Π½Π΅ΠΉ.

ΠœΠ΅ΡΡΡ† 3 ΠΈΠΌΠ΅Π΅Ρ‚ 31 Π΄Π½Π΅ΠΉ.

ΠœΠ΅ΡΡΡ† 4 ΠΈΠΌΠ΅Π΅Ρ‚ 30 Π΄Π½Π΅ΠΉ.

ΠœΠ΅ΡΡΡ† 5 ΠΈΠΌΠ΅Π΅Ρ‚ 31 Π΄Π½Π΅ΠΉ.

ΠœΠ΅ΡΡΡ† 6 ΠΈΠΌΠ΅Π΅Ρ‚ 30 Π΄Π½Π΅ΠΉ.

ΠœΠ΅ΡΡΡ† 7 ΠΈΠΌΠ΅Π΅Ρ‚ 31 Π΄Π½Π΅ΠΉ.

ΠœΠ΅ΡΡΡ† 8 ΠΈΠΌΠ΅Π΅Ρ‚ 31 Π΄Π½Π΅ΠΉ.

ΠœΠ΅ΡΡΡ† 9 ΠΈΠΌΠ΅Π΅Ρ‚ 30 Π΄Π½Π΅ΠΉ.

ΠœΠ΅ΡΡΡ† 10 ΠΈΠΌΠ΅Π΅Ρ‚ 31 Π΄Π½Π΅ΠΉ.

ΠœΠ΅ΡΡΡ† 11 ΠΈΠΌΠ΅Π΅Ρ‚ 0 Π΄Π½Π΅ΠΉ.

ΠœΠ΅ΡΡΡ† 12 ΠΈΠΌΠ΅Π΅Ρ‚ 0 Π΄Π½Π΅ΠΉ.


     ΠœΠΎΠΆΠ½ΠΎ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρƒ компилятора Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ»ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ: просто ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ исчСрпал вСсь список с исходными Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, Ρ‚ΠΎ стал ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ всСм ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹ΠΌ элСмСнтам массива Π½ΡƒΠ»Π΅Π²Ρ‹Π΅ значСния.

     ΠžΠ΄Π½Π°ΠΊΠΎ Π² случаС излишнС большого списка компилятор Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΆΠ΅ Π½Π΅ ΡΡ‚ΠΎΠ»ΡŒ "Π²Π΅Π»ΠΈΠΊΠΎΠ΄ΡƒΡˆΠ΅Π½" ΠΊ Π²Π°ΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ посчитаСт Π²Ρ‹ΡΠ²Π»Π΅Π½Π½ΡƒΡŽ ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ ошибкой. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ нСобходимости Π·Π°Ρ€Π°Π½Π΅Π΅ ΠΏΠΎΠ΄Π²Π΅Ρ€Π³Π°Ρ‚ΡŒ сСбя "насмСшкам" компилятора. Надо просто Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ массив, Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ достаточСн для размСщСния списка:

/* Π΄Π½ΠΈ мСсяца */

int days[ ]=[31, 28, 31, 30, 31, 30, 31, 31, 30, 31];

main( )

{

int index;

extern int days[ ]; /* Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ описаниС */

for(index = 0; index < sizeof days/(sizeof (int)); index++)

printf(" ΠœΠ΅ΡΡΡ† %d ΠΈΠΌΠ΅Π΅Ρ‚ %d Π΄Π½Π΅ΠΉ.\n", index + 1, days [index]);

}

К этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ слСдуСт ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΄Π²Π° сущСствСнных замСчания:

    ΠŸΠ΅Ρ€Π²ΠΎΠ΅: Ссли Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ пустыС скобки для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ массива, Ρ‚ΠΎ компилятор сам ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ количСство элСмСнтов Π² спискС ΠΈ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ для Π½Π΅Π³ΠΎ массив Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°.

    Π’Ρ‚ΠΎΡ€ΠΎΠ΅: ΠΎΠ½ΠΎ касаСтся добавлСния, сдСланного ΠΏ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π΅ΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ for. He полагаясь (Π²ΠΏΠΎΠ»Π½Π΅ обоснованно) Π½Π° свои Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ способности, ΠΌΡ‹ Π²ΠΎΠ·Π»ΠΎΠΆΠΈΠ»ΠΈ Π·Π°Π΄Π°Ρ‡Ρƒ подсчСта Ρ€Π°Π·ΠΌΠ΅Ρ€Π° массива Π½Π° компилятор. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ sizeof опрСдСляСт Ρ€Π°Π·ΠΌΠ΅Ρ€ Π² Π±Π°ΠΉΡ‚Π°Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈΠ»ΠΈ Ρ‚ΠΈΠΏΠ°, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Π·Π° Π½ΠΈΠΌ. (ΠœΡ‹. ΡƒΠΆΠ΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΈ ΠΎΠ± этом Π² Π³Π». 3.) Π’ нашСй Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ систСмС Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта Ρ‚ΠΈΠΏΠ° int Ρ€Π°Π²Π΅Π½ Π΄Π²ΡƒΠΌ Π±Π°ΠΉΡ‚Π°ΠΌ, поэтому для получСния количСства элСмСнтов массива ΠΌΡ‹ Π΄Π΅Π»ΠΈΠΌ ΠΎΠ±Ρ‰Π΅Π΅ число Π±Π°ΠΉΡ‚ΠΎΠ², Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΠΎΠ΅ массивом, Π½Π° 2. Однако Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… систСмах элСмСнт Ρ‚ΠΈΠΏΠ° int ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΈΠ½ΠΎΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π² ΠΎΠ±Ρ‰Π΅ΠΌ случаС выполняСтся Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ sizeof (для элСмСнта Ρ‚ΠΈΠΏΠ° int). НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ нашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹:

ΠœΠ΅ΡΡΡ† 1 ΠΈΠΌΠ΅Π΅Ρ‚ 31 Π΄Π½Π΅ΠΉ.

ΠœΠ΅ΡΡΡ† 2 ΠΈΠΌΠ΅Π΅Ρ‚ 28 Π΄Π½Π΅ΠΉ.

ΠœΠ΅ΡΡΡ† 3 ΠΈΠΌΠ΅Π΅Ρ‚ 31 Π΄Π½Π΅ΠΉ.

ΠœΠ΅ΡΡΡ† 4 ΠΈΠΌΠ΅Π΅Ρ‚ 30 Π΄Π½Π΅ΠΉ.

ΠœΠ΅ΡΡΡ† 5 ΠΈΠΌΠ΅Π΅Ρ‚ 31 Π΄Π½Π΅ΠΉ.

ΠœΠ΅ΡΡΡ† 6 ΠΈΠΌΠ΅Π΅Ρ‚ 30 Π΄Π½Π΅ΠΉ.

ΠœΠ΅ΡΡΡ† 7 ΠΈΠΌΠ΅Π΅Ρ‚ 31 Π΄Π½Π΅ΠΉ.

ΠœΠ΅ΡΡΡ† 8 ΠΈΠΌΠ΅Π΅Ρ‚ 31 Π΄Π½Π΅ΠΉ.

ΠœΠ΅ΡΡΡ† 9 ΠΈΠΌΠ΅Π΅Ρ‚ 30 Π΄Π½Π΅ΠΉ.

ΠœΠ΅ΡΡΡ† 10 ΠΈΠΌΠ΅Π΅Ρ‚ 31 Π΄Π½Π΅ΠΉ.

 ΠΡƒ Π²ΠΎΡ‚, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Ρ‚ΠΎΡ‡Π½ΠΎ 10 Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. Наш ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ самой Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ массива, Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ» Π½Π°ΠΌ Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ ΠΊΠΎΠ½Π΅Ρ† массива.

     Π‘ущСствуСт ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΉ способ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ массивов, Π½ΠΎ ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ строкам, ΠΌΡ‹ рассмотрим Π΅Π³ΠΎ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π³Π»Π°Π²Π΅.

     Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΌΡ‹ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ значСния элСмСнтам массива, относящСгося ΠΊ Π»ΡŽΠ±ΠΎΠΌΡƒ классу памяти. НапримСр, Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ‡Π΅Ρ‚Π½Ρ‹Π΅ числа элСмСнтам автоматичСского массива:

/* присваиваниС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ массиву */

main( )

{

int counter, evens [50];

for(counter = 0; counter < 50; counter++)

evens[counter] = 2 * counter;

...

}

Π£ΠšΠΠ—ΠΠ’Π•Π›Π˜ ΠœΠΠ‘Π‘Π˜Π’ΠžΠ’

     ΠšΠ°ΠΊ Π±Ρ‹Π»ΠΎ сказано Π² Π³Π». 9, ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π½Π°ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с символичСскими адрСсами. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ… Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ интСнсивно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ адрСса, ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ адрСса ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ это дСлаСтся Π² самой машинС, ΠΈ Ρ‚Π΅ΠΌ самым ΠΏΠΎΠ²Ρ‹ΡˆΠ°Ρ‚ΡŒ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. Π’ частности, ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ эффСктивно ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ с массивами. Π”Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, нашС ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ массива прСдставляСт собой просто ΡΠΊΡ€Ρ‹Ρ‚ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ использования ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ.

     ΠΠ°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, имя массива опрСдСляСт Ρ‚Π°ΠΊΠΆΠ΅ Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт, Ρ‚. Π΅. Ссли flizny[] - массив, Ρ‚ΠΎ

flizny == &flizny[0]

ΠΈ ΠΎΠ±Π΅ части равСнства ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ адрСс ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ элСмСнта массива. (Вспомним, Ρ‡Ρ‚ΠΎ опСрация & Π²Ρ‹Π΄Π°Π΅Ρ‚ адрСс.) Оба обозначСния ΡΠ²Π»ΡΡŽΡ‚ΡΡ константами Ρ‚ΠΈΠΏΠ° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π½Π° протяТСнии всСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Однако ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ (ΠΊΠ°ΠΊ значСния) ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ‚ΠΈΠΏΠ° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² Π½ΠΈΠΆΠ΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ происходит со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ указатСля, Ссли ΠΊ Π½Π΅ΠΌΡƒ ΠΏΡ€ΠΈΠ±Π°Π²ΠΈΡ‚ΡŒ число.

/* ΠΏΡ€ΠΈΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ */

main( )

{

int dates[4], *pti, index;

float bills [4], *ptf;

pti = dates; /* присваиваСт адрСс ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ массива */

ptf = bills;

for(index = 0; index < 4; index++)

printf(" ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ + %d:  %10  u  %10u \n", index, pti + index, ptf + index);

}

Π’ΠΎΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ + 0    56014    56026

ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ + 1     56016   56030

ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ + 2    56018    56034

ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ + 3    56020    56038

     ΠŸΠ΅Ρ€Π²Π°Ρ напСчатанная строка содСрТит Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ адрСса Π΄Π²ΡƒΡ… массивов, Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ строка - Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ прибавлСния Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ ΠΊ адрСсу ΠΈ Ρ‚. Π΄. ΠŸΠΎΡ‡Π΅ΠΌΡƒ Ρ‚Π°ΠΊ получаСтся?

56014 + 1 = 56016? 56026 + 1 = 56030?

     ΠΠ΅ Π·Π½Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ? Π’ нашСй систСмС Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅ΠΉ адрСсации являСтся Π±Π°ΠΉΡ‚, Π½ΠΎ Ρ‚ΠΈΠΏ int ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΄Π²Π° Π±Π°ΠΉΡ‚Π°, Π° Ρ‚ΠΈΠΏ float - Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅. Π§Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚, Ссли Π²Ρ‹ скаТСтС: "ΠΏΡ€ΠΈΠ±Π°Π²ΠΈΡ‚ΡŒ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ ΠΊ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ?" ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ языка Π‘ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ памяти. Для массивов это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ адрСсу ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ элСмСнта, Π° Π½Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Π±Π°ΠΉΡ‚Π°. Π’ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΎΠ³ΠΎΠ²Π°Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ссылаСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ; ΠΎΠ΄Π½ΠΎΠ³ΠΎ адрСса здСсь нСдостаточно, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ машина Π΄ΠΎΠ»ΠΆΠ½Π° Π·Π½Π°Ρ‚ΡŒ, сколько Π±Π°ΠΉΡ‚ΠΎΠ² потрСбуСтся для запоминания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. (Π­Ρ‚ΠΎ справСдливо Ρ‚Π°ΠΊΠΆΠ΅ для ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° скалярныС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅; ΠΈΠ½Ρ‹ΠΌΠΈ словами, ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ *pt нСльзя ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.)