6.2. ΠœΠ°ΡΡΠΈΠ²Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ

    «НС Π² совокупности ΠΈΡ‰ΠΈ Сдинства, Π½ΠΎ Π² Π΅Π΄ΠΈΠ½ΠΎΠΎΠ±Ρ€Π°Π·ΠΈΠΈ раздСлСния».

    Козьма ΠŸΡ€ΡƒΡ‚ΠΊΠΎΠ².

    Массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΊΠ°ΠΊ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΊΠ°ΠΊ структура Π΄Π°Π½Π½Ρ‹Ρ…

    Массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ (МУ) – ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ°Ρ структура Π΄Π°Π½Π½Ρ‹Ρ…, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ проявляСтся Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ физичСским ΠΈ логичСским порядком слСдования элСмСнтов. Бпособ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ясСн ΡƒΠΆΠ΅ ΠΈΠ· самого опрСдСлСния: это массив, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ содСрТит ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ (ΠΎΠ±ΡŠΠ΅ΠΊΡ‚).

    Рис. 62.1. Π Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ массивом ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ – Ρ‚ΠΈΠΏΠΎΠΌ ΠΈ структурой Π΄Π°Π½Π½Ρ‹Ρ…
    Рис. 62.1. Π Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ массивом ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ – Ρ‚ΠΈΠΏΠΎΠΌ ΠΈ структурой Π΄Π°Π½Π½Ρ‹Ρ…

    Если это Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ… контСкстного опрСдСлСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€

    double *p[20];

    ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ p слСдуСт ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΊΠ°ΠΊ массив (опСрация []), ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ элСмСнтом ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ являСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Ρ‚ΠΈΠΏΠ° double (опСрация *). ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ p являСтся массивом ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΊΠ°ΠΊ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…, Π½ΠΎ Π½Π΅ являСтся Ρ‚Π°ΠΊΠΎΠ²ΠΎΠΉ ΠΊΠ°ΠΊ структура Π΄Π°Π½Π½Ρ‹Ρ…. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ Π² структуру Π΄Π°Π½Π½Ρ‹Ρ…, ΠΎΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½Π° ΡƒΠΊΠ°Π·ΡƒΠ΅ΠΌΡ‹ΠΌΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ ΠΈ указатСлями (связями).

    ΠœΠ½ΠΎΠ³ΠΎΠΎΠ±Ρ€Π°Π·ΠΈΠ΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ массивов ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΠΎ нСскольким ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ:

    • cΠ°ΠΌ массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ, ΡƒΠΊΠ°Π·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ ссылки (ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ) ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π΄Π°Π½Ρ‹ статичСски (Π² тСкстС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹), Π»ΠΈΠ±ΠΎ динамичСски созданы Π²ΠΎ врСмя Π΅Π΅ выполнСния;

    • двоякая интСрпрСтация указатСля ΠΊΠ°ΠΊ указатСля Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΈ Π½Π° массив ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… (строку), позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠΌΠ΅Ρ€Π½Ρ‹Π΅ Π‘Π” – массивы ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹Π΅ – массивы ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° массивы (строки) Ρ‚Π°ΠΊΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…;

    • ΡƒΠΊΠ°Π·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Β«ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽΒ» структуры Π΄Π°Π½Π½Ρ‹Ρ…, ΠΎΠ΄Π½Π°ΠΊΠΎ массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ ΠΈ Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ (ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹), ΡΠ²Π»ΡΡŽΡ‰ΠΈΠ΅ΡΡ составными частями Π΄Ρ€ΡƒΠ³ΠΈΡ… структур Π΄Π°Π½Π½Ρ‹Ρ….

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

    Π’ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с массивами ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ

    Один Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… ΡƒΠΆΠ΅ Π±Ρ‹Π» Π½Π°ΠΌΠΈ упомянут – это массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ, пСрСмСнная Π²ΠΈΠ΄Π° int *p[]. ΠšΡ€ΠΎΠΌΠ΅ Π½Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΈ Ρ‚ΠΈΠΏ Π²ΠΈΠ΄Π° int **pp, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π² ΠΎΠ±Ρ‰Π΅ΠΌ Π²ΠΈΠ΄Π΅ ΠΊΠ°ΠΊ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ.

    Рис. 62.2. ΠœΠ½ΠΎΠ³ΠΎΠΎΠ±Ρ€Π°Π·ΠΈΠ΅ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΉ Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ… int **pp
    Рис. 62.2. ΠœΠ½ΠΎΠ³ΠΎΠΎΠ±Ρ€Π°Π·ΠΈΠ΅ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΉ Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ… int **pp

    Напомним, Ρ‡Ρ‚ΠΎ Π² Π‘ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ мСсто Π΄Π²Π΅ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ указатСля, Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² тСкстС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ Π²ΠΈΠ΄Ρƒ примСняСмых ΠΊ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ (Ρ‚.Π΅. Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² контСкстС Π΅Π³ΠΎ использования):

    • Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎΠΉ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ указатСля ΠΊΠ°ΠΊ ссылки Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ соотвСтствуСт опСрация косвСнного обращСния ΠΏΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ *pp;

    • согласно ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ адрСсной Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΠΊΠΈ любой ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° Π½Π΅ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΉ массив (ΠΏΠ°ΠΌΡΡ‚ΡŒ) с ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ адрСсациСй ΠΎΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ полоТСния указатСля, Ρ‡Ρ‚ΠΎ поддСрТиваСтся опСрациями индСксации pp[i] ΠΈ добавлСния Ρ†Π΅Π»ΠΎΠ³ΠΎ ΠΊ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ – p++, p+=n.

    Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ допускаСт Ρ†Π΅Π»Ρ‹Ρ… Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ. ΠŸΡ€ΠΈ этом для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· Π½ΠΈΡ… Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ создана (ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π°) своя структура Π΄Π°Π½Π½Ρ‹Ρ…. ПолоТСниС усугубляСтся Π΅Ρ‰Π΅ ΠΈ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π·Π° соотвСтствиСм структуры Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ опСрациями Π½Π°Π΄ Π½Π΅ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ программист (компилятор этого Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚).

    C
    int a = 5, b = 10;  
    int *p = &a; int **pp = &p;
    
    (**pp)++;  *pp=&b;  **pp=0;

    062 04

    ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ – ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, ΠΈΠΌΠ΅Π΅Ρ‚ довольно спСцифичСскоС ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ адрСса Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ структуры Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈ нСобходимости Π΅Π³ΠΎ измСнСния. Π’ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°Ρ… для этой Ρ†Π΅Π»ΠΈ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Π΅Π΅ использованиС ссылки Π½Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ (см. 6.3).

    C
    int a[10] = 5, b[10] = 10;  int *p = a; int **pp = &p;
    
    for (int i = 0; i < 10; i++) (*pp)[i] = 0;
    
    *pp = b;
    
    for (int i = 0;i < 10; i++) { (*pp)++; **pp = i; }

    062 05

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

    Π’ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°Ρ… Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… int** примСняСтся для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с массивами ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ. ΠšΠ»Π°ΡΡΠΈΡ‡Π΅ΡΠΊΠ°Ρ интСрпрСтация - ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ СстСствСнный порядок ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ *p[i] для доступа ΠΊ ΡƒΠΊΠ°Π·ΡƒΠ΅ΠΌΡ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ.

    062 06

    C
    int a = 5, b = 10, с = 15;  
    int *p[] = { &a,&b,&c,NULL }; 
    int **pp=p;
    
    for (int s = 0, i = 0;i < 10; i++)  s = s+*pp[i];

    Массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹Π΅ массивы ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… являСтся Π΄Π²ΡƒΠΌΠ΅Ρ€Π½ΠΎΠΉ структурой Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΄Π²ΠΎΠΉΠ½ΡƒΡŽ ΠΈΠ½Π΄Π΅ΠΊΡΠ°Ρ†ΠΈΡŽ. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ ΠΎΠ½Π° являСтся эквивалСнтом Π΄Π²ΡƒΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ массива.

    C
    int a[] = {5,6,7,8}, b[]={1,2,3,4}, с[]={5,2,4,8};  
    int *p[] = {a,b,c}; int **pp = p;
    
    for (int s = 0, i = 0; i<3;i++) 
    
    for (int j = 0; j < 4; j++)  s = s+pp[i][j];

    062 07

    БтатичСскиС ΠΈ динамичСскиС массивы ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ

    Π”Ρ€ΡƒΠ³ΠΎΠΉ источник разнообразия – способ формирования пСрСчислСнных структур Π΄Π°Π½Π½Ρ‹Ρ…. БтатичСский массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ формируСтся ΠΏΡ€ΠΈ трансляции: ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ (сам массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈ ΡƒΠΊΠ°Π·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅) ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ статичСски, ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Π΄Π°Π½Π½Ρ‹Ρ… Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π° нСпосрСдствСнно Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΈ Β«Π³ΠΎΡ‚ΠΎΠ²Π° ΠΊ Ρ€Π°Π±ΠΎΡ‚Π΅Β».

    int a1,a2,a3, *pd[] = { &a1, &a2, &a3, NULL};

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

    C
    int d[19], *pd[20];
    
    for (i=0; i<19; i++) pd[i] = &d[i];
    
    pd[i] = NULL;

    Π£ΠΊΠ°Π·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒΡΡ динамичСски, ΠΈΡ… адрСса Π·Π°ΠΏΠΎΠ»Π½ΡΡŽΡ‚ статичСский массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ.

    C
    int *p, *pd[20];
    
    for (i=0; i<19; i++){ p = new int; *p = i;  pd[i] = p; }
    
    pd[i] = NULL;

    НаконСц, Ссли массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ формируСтся ΠΊΠ°ΠΊ динамичСская структура Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚ΠΎ динамичСский массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ создаСтся Π² процСссС Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ new Π² качСствС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ, Ρ‚.Π΅. Ρ‚ΠΈΠΏ int**, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ запоминаСтся Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ‚ΠΈΠΏΠ°.

    C
    int **pp, *p;
    
    pp = new int *[20];   // ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΠΎΠ΄ массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ
    
    for (i=0; i<19; i++) {// ΠΈΠ· 20 ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Ρ‚ΠΈΠΏΠ° int*                                          
          p = new int;
          *p = i;
    
          pp[i] = p; // ΠΌΠΎΠΆΠ½ΠΎ pp[i] = new int; *pp[i] = i;
    }
    
    pp[i] = NULL;

    Массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ. ЀизичСский ΠΈ логичСский порядок ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с массивом ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π΄Π²Π° контСкста:

    • pp[i] -i-ΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π² массивС;

    • *pp[i] -Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ i-ΠΎΠΉ ΡƒΠΊΠ°Π·ΡƒΠ΅ΠΌΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.

    Алгоритмы Ρ€Π°Π±ΠΎΡ‚Ρ‹ с массивом ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ массивом внСшнС ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠΈ. Π Π°Π·Π½ΠΈΡ†Π° ΠΆΠ΅ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… Π² ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ массивС соотвСтствуСт ΠΈΡ… физичСскому порядку слСдования Π² памяти, Π° массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ позволяСт ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ логичСский порядок слСдования элСмСнтов Π² соотвСтствии с Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° Π½ΠΈΡ…. Π’ΠΎΠ³Π΄Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ порядка слСдования (Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, упорядочСниС, пСрСстановка), ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π² ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ массивС Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ самих элСмСнтов, Π² массивС ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠΎΠΏΡ€ΠΎΠ²ΠΎΠΆΠ΄Π°Ρ‚ΡŒΡΡ опСрациями Π½Π°Π΄ указатСлями Π½Π° Π½ΠΈΡ…. ΠžΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹Π΅ прСимущСства Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚, ΠΊΠΎΠ³Π΄Π° сами ΡƒΠΊΠ°Π·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ достаточно большими, Π»ΠΈΠ±ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΈΡ… Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎ ΠΊΠ°ΠΊΠΈΠΌ-Π»ΠΈΠ±ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π° Π½ΠΈΡ… ΡΡΡ‹Π»Π°ΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ части ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹). Для сравнСния ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ сортировки массива ΠΈ массива ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ.

    C
    //------------------------------------------------------62-01.cpp
    //--- Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° массива ΠΈ массива ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ
    void sort1(double d[], int sz) {
      int i, k;
    
      do {
    
        for (k = 0, i = 0; i < sz - 1; i++)
    
          if (d[i] > d[i + 1])
    
        {
          double c;
          c = d[i];
          d[i] = d[i + 1];
          d[i + 1] = c;
          k = 1;
        }
    
      } while (k);
    }
    
    void sort2(double * pd[]) {
      int i, k;
    
      do {
        for (k = 0, i = 0; pd[i + 1] != NULL; i++)
    
          if ( * pd[i] > * pd[i + 1]) // Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ ΡƒΠΊΠ°Π·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…
    
        {
          double * c; // ΠŸΠ΅Ρ€Π΅ΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ
    
          c = pd[i];
          pd[i] = pd[i + 1];
          pd[i + 1] = c;
          k = 1;
        }
    
      } while (k);
    }

    ДинамичСский массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ (ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹)

    Если динамичСский массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ ссылаСтся Π½Π° мноТСство Β«ΡƒΠΆΠ΅ извСстных», Ρ‚.Π΅. Π½Π΅ ΠΈΠΌ созданных ΠΈ Π½Π΅ Π΅ΠΌΡƒ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… (ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²), Ρ‚ΠΎ Π΅Π³ΠΎ умСстно Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡŽ, ΠΈΠΌΠ΅ΡŽΡ‰ΡƒΡŽ собствСнный логичСский порядок. Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° рассмотрим Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая создаСт массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° упорядочСнныС ΠΏΠΎ Π²ΠΎΠ·Ρ€Π°ΡΡ‚Π°Π½ΠΈΡŽ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ значСния, взятыС ΠΈΠ· массива. Как ΠΈ для любого динамичСского массива, для массива ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ справСдливы всС Π²Ρ‹Π²ΠΎΠ΄Ρ‹ ΠΎ Π΅Π³ΠΎ размСрности: Π² Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ вычислСна Π·Π°Ρ€Π°Π½Π΅Π΅. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ double ** - ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° динамичСский массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ, созданный Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

    CPP
    //------------------------------------------------------62-02.cpp
    //-------- ДинамичСский массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ
    // Π½Π° упорядочСнныС ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ элСмСнты исходного массива
    double ** create(double in [], int n) {
      int i, j, m; // Π’Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ
    
      for (i = 0, m = 0; i < n; i++)
        if ( in [i] > 0) m++;
    
      double ** pp = new double * [m + 1]; // Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Π”ΠœΠ£
    
      pp[m] = NULL;
    
      for (i = 0, j = 0; i < n; i++) // Π—Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π°
    
        if ( in [i] > 0) pp[j++] = & in [i]; // ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ элСмСнт
    
      sort2(pp);
    
      return pp;
    }

    ДинамичСский массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° массивы ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…

    Π£ΠΊΠ°Π·ΡƒΠ΅ΠΌΡ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ Π² массивС ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Π°Ρ пСрСмСнная, Ρ‚Π°ΠΊ ΠΈ массив Ρ‚Π°ΠΊΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. Π’ послСднСм случаС ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ Π°Π½Π°Π»ΠΎΠ³ Π΄Π²ΡƒΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ массива: ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ индСкс Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° массив, Π²Ρ‚ΠΎΡ€ΠΎΠΉ – элСмСнт этого массива. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, аналогия здСсь Π΄Π°ΠΆΠ΅ синтаксичСская: Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ p[i][j] ΠΏΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌΠΎ Π² ΠΎΠ±ΠΎΠΈΡ… случаях ΠΈ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния логичСской ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ – j-Ρ‹ΠΉ элСмСнт i-ΠΎΠΉ строки. ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²ΠΎ массива ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ проявляСтся, Ссли Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Π΅Ρ‚ ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ размСрности. Π”Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив Π² Π‘ΠΈ всСгда Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Π²Ρ‚ΠΎΡ€ΡƒΡŽ Ρ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ (для вычислСния адрСсов транслятор Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π½Π°Ρ‚ΡŒ Π΄Π»ΠΈΠ½Ρƒ строки ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹). Для массива ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ – это излишнС.

    Рис. 62.3. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ размСрности Π² Π²ΠΈΠ΄Π΅ Π”ΠœΠ£ Π½Π° строки
    Рис. 62.3. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ размСрности Π² Π²ΠΈΠ΄Π΅ Π”ΠœΠ£ Π½Π° строки

    C
    //-------------------------------------------------------------------------------------62-03.cpp
    //--- ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΉ  размСрности - массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° массивы
    double ** load(char nm[], int & n, int & m) { // РазмСрности ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ – ΠΏΠΎ ссылкС
      FILE * fd = fopen(nm, "r");
    
      if (fd == NULL) return NULL;
    
      fscanf(fd, "%d%d", & n, & m); // Π§Ρ‚Π΅Π½ΠΈΠ΅ размСрностСй
    
      double ** pp = new double * [n]; // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π”ΠœΠ£ ΠΏΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠΉ размСрности
    
      for (int i = 0; i < n; i++) {
    
        pp[i] = new double[m]; // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹Ρ… Π”Πœ (строк)
    
        for (int j = 0; j < m; j++) fscanf(fd, "%lf", & pp[i][j]);
    
      }
    
      fclose(fd);
    
      return pp;
    }
    
    double sum(double ** p, int n, int m) {
      double s = 0;
    
      for (int i = 0; i < n; i++)
    
        for (int j = 0; j < m; j++) s += p[i][j];
    
      return s;
    }
    
    void main() {
      int n1, m1;
    
      double ** pp = load("62-03.txt", n1, m1);
    
      if (pp != NULL) {
    
      printf("sum(%d,%d)=%2.0lf\n", n1, m1, sum(pp, n1, m1));
      destroy(pp, n1);
    }

    Π’ Π΄Π°Π½Π½ΠΎΠΌ прСдставлСнии ΡƒΠΊΠ°Π·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ – строки ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Β«ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽΒ» структуры Π΄Π°Π½Π½Ρ‹Ρ…. ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° освобоТдСния памяти ΠΈΠ·-ΠΏΠΎΠ΄ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ динамичСской структуры Π΄Π°Π½Π½Ρ‹Ρ… происходит Π² Π΄Π²Π° этапа: сначала Π² Ρ†ΠΈΠΊΠ»Π΅ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°ΡŽΡ‚ΡΡ динамичСскиС массивы – строки, Π° Π·Π°Ρ‚Π΅ΠΌ – сам массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ.

    C
    //------------------------------------------------------------------62-03.cpp
    void destroy(double **pp, int n) {
      for (int i = 0; i < n; i++) delete []pp[i];
      delete []pp; 
    }

    Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ динамичСский массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ ссылаСтся Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ структуры Π΄Π°Π½Π½Ρ‹Ρ…. Π‘ Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ логичСскоС прСдставлСниС структуры Π΄Π°Π½Π½Ρ‹Ρ…, ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎΠ΅ ΠΎΡ‚ Π΅Π΅ исходного физичСского прСдставлСния.

    Рис. 62.4. ДвумСрная массив Π½Π° основС Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ³ΠΎ (ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎΠ΅ слияниС)
    Рис. 62.4. ДвумСрная массив Π½Π° основС Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ³ΠΎ (ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎΠ΅ слияниС)

    CPP
    //------------------------------------------------------62-04.cpp
    // ΠŸΡ€ΠΎΡΡ‚ΠΎΠ΅ ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎΠ΅ слияниС - массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ
    // Π½Π° Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹Π΅ массивы (части Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ³ΠΎ массива)
    
    void sort(int a[], int n); // любая сортировка ΠΎΠ΄Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ массива
    
    void big_sort(int A[], int N){
    
    int max=A[0],i,j,k,n=sqrt(N)+1;
    
    int **B=new int*[n];
    
    int *L=new int[n],*C=new int[N]; // массив размСрностСй частСй
    
    for (i=0; i<n; i++) B[i]=&A[i*n];
    
    for (i=0; i<n-1; i++) L[i]=n;
    
    L[n-1]=N-n*(n-1);                // Π Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ послСднСго массива
    
    for (i=0; i<n; i++) sort(B[i],L[i]); // Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° частСй
    
    for (i=0; i<N; i++) { // БлияниС
      for (k=-1, j=0; j<n; j++) { // k - индСкс строки с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ                 
        if (L[j]==0) continue; // ΠŸΡ€ΠΎΠΏΡƒΡΠΊ слитых строк
    
        if (k==-1 || *B[j] < *B[k]) k=j; 
      }
    
      C[i] = *B[k]; // ΠŸΠ΅Ρ€Π΅Π½ΠΎΡ элСмСнта
      B[k]++;       // Π‘Π΄Π²ΠΈΠ³ k-Π³ΠΎ указатСля
      L[k]--;
    }
    
    for (i=0; i<N; i++) A[i]=C[i]; // Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ
    
    delete []B;
    
    delete []C;}

    ДинамичСский массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ создаСт эффСкт двумСрности Π½Π°Π΄ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΌ массивом, Π½Π΅ мСняя Π΅Π³ΠΎ физичСской структуры. Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½Ρ‹ΠΌ слияниСм (см. 4.6) Ρ€Π°Π·Π±ΠΈΠ²Π°Π΅Ρ‚ Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ массив Π½Π° части, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ нСзависимо. Для создания Ρ‚Π°ΠΊΠΎΠ³ΠΎ прСдставлСния достаточно Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ динамичСский массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ B адрСсами Π³Ρ€ΡƒΠΏΠΏ ΠΏΠΎ n элСмСнтов (B[i]=&A[i*n]) исходного Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ³ΠΎ массива. Для ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ слияния частСй Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ создаСтся массив счСтчиков Π΄Π»ΠΈΠ½ этих частСй L. Π’ процСссС слияния ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… упорядочСнных ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ послС чтСния Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ элСмСнта ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π½Π΅Π³ΠΎ смСщаСтся Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π·Π° Π½ΠΈΠΌ, Π° счСтчик ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ (C[i]=*B[k]; B[k]++; L[k]--;).

    ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ тСкста. ДинамичСский массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° строки

    Массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π²ΠΈΠ΄Π° char*p[] ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° строки символов, Ρ‚.Π΅. строчный тСкст. Π’Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ Π΅Π³ΠΎ создания Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ. Π’ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ статичСской структурС Π΄Π°Π½Π½Ρ‹Ρ… массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ создаСтся статичСски ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ строковыми константами - вся структура Π΄Π°Π½Π½Ρ‹Ρ… Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄. Напомним, Ρ‡Ρ‚ΠΎ строковая константа Π²ΠΎ всСх контСкстах понимаСтся ΠΊΠ°ΠΊ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° сформированный транслятором массив, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ символами строки.

    char *pc[] = { "aaa", "bbb", "ccc", NULL};

    Массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° строки, для размСщСния ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив символов (массив строк).

    C
    char **pc, cc[100][80];
    
    pc = new char*[101]; // ДинамичСский массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ
    
    for (i=0; i<19; i++) pc[i] = cc[i]; // Π½Π° строки статичСского массива
    
    pc[i] = NULL;

    Π—Π΄Π΅ΡΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π΄Π²Π΅ особСнности ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹Ρ… массивов. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив интСрпрСтируСтся ΠΊΠ°ΠΊ массив элСмСнтов ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ индСкса, состоящих ΠΈΠ· элСмСнтов Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ индСкса, Π² Π΄Π°Π½Π½ΠΎΠΌ случаС -100 массивов символов ΠΏΠΎ 80 символов Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ. Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π΄Π²ΡƒΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ массива с ΠΎΠ΄Π½ΠΈΠΌ индСксом интСрпрСтируСтся ΠΊΠ°ΠΊ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π½Π°Ρ‡Π°Π»ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ массива элСмСнтов Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ индСкса, Π² Π΄Π°Π½Π½ΠΎΠΌ случаС - ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° i-ΠΉ массив ΠΈΠ· 80 символов (строку).

    Бинтаксис ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ извлСчСния символа ΠΈΠ· массива ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° строки ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π΅Π½ синтаксису Π΄Π²ΡƒΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ массива символов, Ρ‚.Π΅. ΠΈΠΌΠ΅Π΅Ρ‚ мСсто ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒ массива ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈ Π΄Π²ΡƒΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ массива. ΠŸΠ΅Ρ€Π²Π°Ρ индСксация ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ ΠΈΠ· массива i-Ρ‹ΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, вторая ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ j-Ρ‹ΠΉ символ ΠΈΠ· строки, адрСсуСмой ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ.

    C
    char      *p[]={β€œaaa”,β€œbbb”,β€œccc”,NULL};
    
    char      A[][20]={β€œaaa”,β€œbbb”,β€œccc”};
    
    p[i]                    // ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° i-ю строку Π² массивС ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ
    
    A[i]                   // ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π½Π°Ρ‡Π°Π»ΠΎ i-ΠΎΠΉ строки Π² Π΄Π²ΡƒΠΌΠ΅Ρ€Π½ΠΎΠΌ массивС
    
    p[i][j]                 // j-ΠΉ символ Π² i-ΠΎΠΉ строкС массива ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ
    
    A[i][j]                // j-ΠΉ символ Π² i-ΠΎΠΉ строкС Π΄Π²ΡƒΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ массива

    ΠžΡ‚ΠΌΠ΅Ρ‡Π΅Π½Π½ΠΎΠ΅ свойство ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Сдинство логичСской ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΄Π²ΡƒΡ… структур Π΄Π°Π½Π½Ρ‹Ρ…. Но ΠΏΡ€ΠΈ этом Π½Π΅ слСдуСт Π·Π°Π±Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ физичСская ΠΈΡ… рСализация Ρ€Π°Π·Π»ΠΈΡ‡Π½Π°. Π’ΠΎΠΎΠ±Ρ‰Π΅-Ρ‚ΠΎ массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° строки Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° нСзависимыС тСкстовыС строки. Π­Ρ‚ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° Π½Π°Ρ‡Π°Π»Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ² Π² ΠΎΠ΄Π½ΠΎΠΉ (ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ…) строках, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ слова. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ динамичСский массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° упорядочСнныС ΠΏΠΎ Π΄Π»ΠΈΠ½Π΅ слова исходной строки.

    CPP
    //------------------------------------------------------62-05.cpp
    //--- Массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° отсортированныС ΠΏΠΎ Π΄Π»ΠΈΠ½Π΅ слова
    int my_strlen(char * p) {
      for (int i = 0;* p != 0 && * p != ' '; p++, i++);
    
      return i;
    }
    
    char ** SortedWords(char * p) {
    
      int nw = 0, k;
      char * q;
    
      for (q = p;* q != 0; q++) // ΠŸΠΎΠ΄ΡΡ‡Π΅Ρ‚ количСства слов ΠΏΠΎ ΠΊΠΎΠ½Ρ†Π°ΠΌ слов
    
        if (q[0] != ' ' && (q[1] == ' ' || q[1] == 0)) nw++;
    
      char ** qq = new char * [nw + 1]; // Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Π”ΠœΠ£ Π½Π° строки (символы строки)
    
      nw = 0;
    
      if ( * p != ' ') qq[nw++] = p; // Π‘Ρ‚Ρ€ΠΎΠΊΠ° начинаСтся со слова
    
      for (p++;* p != 0; p++) // Если Π½Π°Ρ‡Π°Π»ΠΎ слова -
    
        if (p[0] != ' ' && p[-1] == ' ') // Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π² строкС
    
          qq[nw++] = p;
    
      qq[nw] = NULL;
    
      do { // Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° массива ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ
    
        k = 0; // с использованиС собствСнной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
    
        for (int i = 0; i < nw - 1; i++) // сравнСния слов (Π΄ΠΎ ΠΏΡ€ΠΎΠ±Π΅Π»Π°)
    
          if (my_strlen(qq[i]) > my_strlen(qq[i + 1])) {
    
            k++;
    
            char * g = qq[i];
            qq[i] = qq[i + 1];
            qq[i + 1] = g;
    
          }
    
      } while (k);
    
      return qq;
    }

    ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° размСрности динамичСского массива ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ

    Для динамичСских массивов ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ‚Π΅ ΠΆΠ΅ самыС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ размСрности, Ρ‡Ρ‚ΠΎ ΠΈ для ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… динамичСских массивов, ΠΈ Ρ€Π΅ΡˆΠ°ΡŽΡ‚ΡΡ ΠΎΠ½ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ (см.5.6). ΠŸΡ€ΠΈ Π·Π°Ρ€Π°Π½Π΅Π΅ нСизвСстной Π΅Π³ΠΎ размСрности ΠΌΠΎΠΆΠ½ΠΎ пСриодичСски ΠΏΠ΅Ρ€Π΅Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΠΎΠ΄ массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня realloc, удваивая ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ. Если ΠΆΠ΅ сами строки Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ Π² достаточно большой статичСский Π±ΡƒΡ„Π΅Ρ€, Π° Π·Π°Ρ‚Π΅ΠΌ ΡΠ½ΠΈΠΌΠ°Ρ‚ΡŒ с Π½ΠΈΡ… динамичСскиС ΠΊΠΎΠΏΠΈΠΈ (функция strdup), Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ экономичноС построчноС прСдставлСниС тСкста Π² памяти Π² Π²ΠΈΠ΄Π΅ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ динамичСской структуры Π΄Π°Π½Π½Ρ‹Ρ….

    CPP
    //------------------------------------------------------62-06.cpp
    //------- Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π”ΠœΠ£ ΠΈΠ· строк Ρ„Π°ΠΉΠ»Π°
    
    char ** loadfile(FILE * fd) {
    
      char str[1000];
    
      int n, sz = SIZE0; // Кол-Π²ΠΎ строк ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ Π”ΠœΠ£
    
      char ** pp = new char * [sz]; // Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Π”ΠœΠ£
    
      for (n = 0; fgets(str, 1000, fd) != NULL; n++) {
    
        pp[n] = strdup(str); // Копия строки Π² Π”Πœ
    
        if (n + 1 == sz) { // Π‘ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ -
    
          sz *= 2; // ΡƒΠ΄Π²ΠΎΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ
    
          pp = (char ** ) realloc(pp, sizeof(char * ) * sz);
    
        }
      }
    
      pp[n] = NULL; // ΠžΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚Π΅Π»ΡŒ массива ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ
    
      return pp;
    }

    ΠŸΡ€ΠΈ вычислСнии размСрности Π½ΠΎΠ²ΠΎΠ³ΠΎ массива ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ realloc ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ Ρ‚ΠΈΠΏΠ° Ρ…Ρ€Π°Π½ΠΈΠΌΠΎΠ³ΠΎ элСмСнта – указатСля sizeof(char*), Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ адрСс приводится ΠΊ Ρ‚ΠΈΠΏΡƒ – ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ char**.

    Π›Π°Π±ΠΎΡ€Π°Ρ‚ΠΎΡ€Π½Ρ‹ΠΉ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΡƒΠΌ

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

    2. Ѐункция ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ строку тСкста ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ динамичСский массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° слова. КаТдоС слово копируСтся Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ массив Π² динамичСской памяти.

    3. Ѐункция ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ строку, Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ самый Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ Π² скобках ΠΈ Π²Ρ‹Ρ€Π΅Π·Π°Π΅Ρ‚ Π΅Π³ΠΎ. ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ повторяСтся Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ останСтся скобок. ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρ‹ ΠΈ остаток строки Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π² динамичСском массивС ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ.

    4. Ѐункция Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ Π² строкС Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρ‹, симмСтричныС ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ символа, Π΄Π»ΠΈΠ½ΠΎΠΉ 7 ΠΈ Π±ΠΎΠ»Π΅Π΅ символов (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, "abcdcba") ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ динамичСский массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° ΠΊΠΎΠΏΠΈΠΈ Ρ‚Π°ΠΊΠΈΡ… Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ².

    5. Ѐункция Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ Π² строкС ΠΏΠ°Ρ€Ρ‹ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ², содСрТащих ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Ρ… символов Π΄Π»ΠΈΠ½ΠΎΠΉ Π±ΠΎΠ»Π΅Π΅ 3 (ΠΊΡ€ΠΎΠΌΠ΅ ΠΏΡ€ΠΎΠ±Π΅Π»Π°) ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ динамичСский массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° ΠΊΠΎΠΏΠΈΠΈ Ρ‚Π°ΠΊΠΈΡ… Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ².

    6. Π‘Ρ‚Π΅ΠΊ модСлируСтся ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ динамичСского массива ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹Π΅ массивы размСрности N Ρ†Π΅Π»Ρ‹Ρ…. Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ стСка – Π΄Π²Π° индСкса – Π² массивС ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΌ массивС. Π’ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ push ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ³ΠΎ массива Π² массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ добавляСтся Π½ΠΎΠ²Ρ‹ΠΉ, Ссли опСрация pop ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌΡƒ массиву, Ρ‚ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ утилизуСтся.

    7. ΠžΡ‡Π΅Ρ€Π΅Π΄ΡŒ модСлируСтся ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ динамичСского массива ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹Π΅ массивы размСрности N Ρ†Π΅Π»Ρ‹Ρ…. Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΈ послСдний элСмСнты ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ – Π΄Π²Π° индСкса – Π² массивС ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΌ массивС. Π’ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ добавлСния ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ³ΠΎ массива Π² массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ добавляСтся Π½ΠΎΠ²Ρ‹ΠΉ, Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ извлСчСния – ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π΅ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΌΡƒ массиву Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ утилизуСтся (ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π² массивС ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ ΡΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ ΠΊ Π½Π°Ρ‡Π°Π»Ρƒ).

    8. Ѐункция Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ ΠΈΠ· Ρ„Π°ΠΉΠ»Π° тСкст ΠΏΠΎ словам ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΄Π²ΡƒΡ…ΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹ΠΉ динамичСский массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° строки, содСрТащиС слова ΠΈΠ· исходного Ρ„Π°ΠΉΠ»Π° (Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… char *** - см. 87. иСрархичСскиС структуры Π΄Π°Π½Π½Ρ‹Ρ…). Π Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ массива ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½ΠΈΠΆΠ½Π΅Π³ΠΎ уровня Π·Π°Π΄Π°Π½Π°, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ NULL. Π—Π°Ρ‚Π΅ΠΌ сортируСт массивы ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½ΠΈΠΆΠ½Π΅Π³ΠΎ уровня, Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ сортировкупутСм ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎΠ³ΠΎ слияния (см. 4.6 Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΈ поиск).

    9. Ѐункция Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ ΠΈΠ· Ρ„Π°ΠΉΠ»Π° тСкст ΠΏΠΎ словам ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΄Π²ΡƒΡ…ΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹ΠΉ динамичСский массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° строки Π½Π° строки, содСрТащиС слова ΠΈΠ· исходного Ρ„Π°ΠΉΠ»Π°, упорядочСнныС ΠΏΠΎ Π°Π»Ρ„Π°Π²ΠΈΡ‚Ρƒ (Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… char *** - см. 87. иСрархичСскиС структуры Π΄Π°Π½Π½Ρ‹Ρ…). Π Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ массива ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½ΠΈΠΆΠ½Π΅Π³ΠΎ уровня Π·Π°Π΄Π°Π½Π°, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ NULL. ΠžΡ‡Π΅Ρ€Π΅Π΄Π½Π°Ρ строка вставляСтся с сохранСниСм порядка, Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ Ρ†ΠΈΠΊΠ»Π΅ просматриваСтся массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ уровня ΠΈ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ – элСмСнт с индСксом 0 Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ уровня. Если Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ большС Π½ΠΎΠ²ΠΎΠ³ΠΎ, Ρ‚ΠΎ выполянСтся вставка Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½ΠΈΠΆΠ½Π΅Π³ΠΎ уровня. Если ΠΏΡ€ΠΈ вставкС происходит ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, массив создаСтся Π½ΠΎΠ²Ρ‹ΠΉ массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ копируСтся ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ.

    Вопросы Π±Π΅Π· ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ²

    Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ сформулируйтС дСйствиС, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠΌΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Π½Π°Π΄ массивом ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для статичСских Π΄Π°Π½Π½Ρ‹Ρ….

    ΠŸΡ€ΠΈΠΌΠ΅Ρ€ выполнСния задания.

    C
    //------------------------------------------------------62-07.cpp
    double * F(double * p[], int k) {
    
      for (int i = 0; p[i] != 0; i++); // ВСкущая Ρ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ массива ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ
    
      if (k >= i) return NULL; // Π‘ΠΎΠ»ΡŒΡˆΠ΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ размСрности - Π½Π΅ΡƒΠ΄Π°Ρ‡Π°
    
      double * q = p[k]; // Π—Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ k- Ρ‹ΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ
    
      for (; k < i; k++) p[k] = p[k + 1]; // Π‘Π΄Π²ΠΈΠ½ΡƒΡ‚ΡŒ " хвост" Π½Π° 1 ΠΊ Π½Π°Ρ‡Π°Π»Ρƒ - ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ
    
      return q;
    } // k-Ρ‹ΠΉ ΠΈ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π΅Π³ΠΎ
    
    double a1 = 4, a2 = 7, a3 = 5, a4 = 1, * pp[] = {
      & a1,
      & a2,
      & a3,
      & a4,
      NULL
    };
    
    void main() {
      printf("\nΠ£Π΄Π°Π»Π΅Π½ ΠΏΠΎ n=2 ...%2.0lf\n", * F(pp, 2));
    
      for (int i = 0; pp[i] != NULL; i++) printf(" %2.0lf", * pp[i]);
    
    } // Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚ 5 ... 4,7,1.

    Ѐункция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° double. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ бСрСтся ΠΎΡ‚Ρ‚ΡƒΠ΄Π°. Π”Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΈΠ· массива копируСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, Π½ΠΎΠΌΠ΅Ρ€ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π·Π°Π΄Π°Π½ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ. Π’ΠΎ Π΅ΡΡ‚ΡŒ функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΏΠΎ Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡƒ логичСскому Π½ΠΎΠΌΠ΅Ρ€Ρƒ. ΠŸΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ подсчитываСтся тСкущая Ρ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ структуры Π΄Π°Π½Π½Ρ‹Ρ… – количСство ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π² массивС. Если логичСский Π½ΠΎΠΌΠ΅Ρ€ Π΅Π³ΠΎ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚, возвращаСтся NULL. И послСднСС. ПослС запоминания k-Π³ΠΎ указатСля всС ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΡΠ΄Π²ΠΈΠ³Π°ΡŽΡ‚ΡΡ Π½Π° 1 ΠΊ Π½Π°Ρ‡Π°Π»Ρƒ, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ «затираСтся». Π’ΠΎ Π΅ΡΡ‚ΡŒ функция ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΏΠΎ логичСскому Π½ΠΎΠΌΠ΅Ρ€Ρƒ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΅Π³ΠΎ Π² качСствС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°. Для задания статичСской структуры Π΄Π°Π½Π½Ρ‹Ρ… сначала ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΡƒΠΊΠ°Π·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΠ° double, Π° Π·Π°ΠΌΠ΅Ρ‚ массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ инициализируСтся ΠΈΡ… адрСсами.

    C
    //------------------------------------------------------62-08.cpp
    //------------------------------------------------------- 1
    
    int F1(double * p[]) {
    
      int n;
    
      for (n = 0; p[n] != NULL; n++);
    
      return n;
    }
    
    //------------------------------------------------------- 2
    
    void F2(double * p[]) {
    
      int i, k;
    
      for (k = 1; pd[k] != NULL; k++)
    
        for (i = k; i > 0 && * pd[i] < * pd[i - 1]; i--) {
    
          double * q = pd[i];
          pd[i] = pd[i - 1];
          pd[i - 1] = q;
    
        }
    }
    
    //------------------------------------------------------ 3
    
    void F3(double * p[], double * q) {
    
      int i, n;
    
      for (i = 0; p[i] != 0; i++)
    
        if ( * p[i] > * q) break;
    
      for (n = i; p[n] != NULL; n++);
    
      for (; n >= i; n--) p[n + 1] = p[n];
    
      p[i] = q;
    }
    
    //------------------------------------------------------ 4
    
    int F4(char * p[]) {
    
      int k, i, j;
    
      for (k = i = 0; p[i] != NULL; i++)
    
        for (j = 0; p[i][j] != 0; j++, k++);
    
      return k;
    }
    
    //------------------------------------------------------ 5
    
    char ** F5(char a[][80], int n) {
    
      int i;
      char ** p;
    
      p = new char * [n + 1];
    
      for (i = 0; i < n; i++) p[i] = a[i];
    
      p[n] = NULL;
    
      return p;
    }
    
    //------------------------------------------------------ 6
    
    char * F6(char * p[]) {
    
      int i, sz, l, k;
    
      for (i = sz = k = 0; p[i] != NULL; i++)
    
        if ((l = strlen(p[i])) > sz) {
          sz = l;
          k = i;
        }
    
      return (p[k]);
    }
    
    //------------------------------------------------------ 7
    
    char ** F7(char c[]) {
    
      char ** p;
      int i, n, cnt;
    
      p = new char * [20];
    
      for (i = n = cnt = 0; c[n] != 0; n++) {
    
        if (c[n] == ' ')
    
        {
          c[n] = '\0';
          cnt = 0;
        } else
    
        {
          cnt++;
    
          if (cnt == 1) p[i++] = & c[n];
    
          if (i == 19) break;
    
        }
      }
    
      p[i] = NULL;
      return (p);
    }
    
    //------------------------------------------------------ 8
    
    char * F8(char * p[], int m) {
    
      int n;
      char * q;
    
      for (n = 0; p[n] != NULL; n++);
    
      if (m >= n) return (NULL);
    
      q = p[m];
    
      for (n = m; p[n] != NULL; n++) p[n] = p[n + 1];
    
      return q;
    }
    
    //------------------------------------------------------ 9
    
    int F9(char * p[], char * str) {
    
      int h, l, m;
    
      for (h = 0; p[h] != NULL; h++);
    
      for (h--, l = 0; h >= l;) {
    
        m = (l + h) / 2;
    
        int k = strcmp(p[m], str);
    
        if (k < 0) l = m + 1;
    
        else h = m - 1;
      }
    
      return -1;
    }
    
    //----------------------------------------------------- 10
    
    char ** F10() {
    
      int n;
      char ** p, s[80];
    
      p = new char * [100];
    
      for (n = 0; n < 99 && (gets(s), s[0] != '\0'); n++)
    
        p[n] = strdup(s);
    
      p[n] = NULL;
      return (p);
    }
    
    //----------------------------------------------------- 11
    
    void F11(char * p[], int m) {
    
      int n;
      char * q;
    
      for (n = 0; p[n] != 0; n++);
    
      if (m >= n) return;
    
      for (; n > m; n--) p[n + 1] = p[n];
    
      p[m + 1] = strdup(p[m]);
    }
    
    //----------------------------------------------------- 12
    
    double F12(double * p[], int n) {
    
      double s = 0;
    
      for (int i = 0; p[i] != NULL; i++)
    
        for (int j = 0; j < n; j++) s += p[i][j];
    
      return s;
    }