Бір өлшемді массивтер және нұсқаушылар


Си тілінде массивтер мен нұсқауыштар арасында байланыс бар. Мысалы, массив int array[25] түрінде сипатталса, онда массивтің жиырма бес элементі үшін жадыдан орын бөлу ғана орындалмайды, сонымен қатар мәні массивтің бірінші элементінің (яғни, саны бойынша нөлдік) адресіне тең, array атты нұсқауыш үшін де орын бөлу орындалады, яғни,  массивтің өзі атсыз қалады, ал массивтің элементтеріне рұқсат алу array атты нұсқауыш арқылы жүзеге асырылады. Тіл синтаксисіне сәйкес array нұсқауышы тұрақты болып табылады, оның мәнін өрнектерде қолдануға болады, бірақ, бұл мәндерді өзгертуге болмайды.

Массив аты нұсқауыш болғандықтан, келесідей меншіктеуге рұқсат етілген :

         int array[25];

         int *ptr;

         ptr=array;

Мұнда ptr нұсқауышы массивтің бірінші элементінің адресіне орнатылған, сонымен қатар ptr=array меншіктеуін келесі эквивалентті түрінде жазуға болады:

ptr=&array[0].

Массив элементтеріне рұқсат алудың екі әдісі бар. Біріншісі, қарапайым квадрат жақша ішінде  индекс мәндерін қолданумен байланысты. Мысалы,  array[16]=3 немесе array[i+2]=7. Мұндай рұқсат алу әдісінде екі өрнек жазылады, екінші өрнек квадрат жақшаға алынады. Бұл өрнектердің біреуі нұсқауыш, ал екіншісі бүтін типті мән. Бұл кезектіліктің жазылуы кез келген бола алады, бірақ, жақша ішіне екінші тұрғаны жазылады. Сондықтан array[16] және  16[array] жазылулары эквивалентті және массивтің он алтыншы элементін білдіреді. Индекті түрде қолданылған нұсқауыштың міндетті түрде қандай да бір массивке нұсқайтын, тұрақты болуы керек емес, ол айнымалы да бола алады. Дербес жағдайда, ptr=array  меншіктелуі орындалғаннан кейін массивтің он алтыншы элементіне рұқсат алу ptr  формасында келесідей болуы мүмкін:  ptr[16] немесе 16[ptr].

Массив элементтеріне рұқсат алудың екінші әдісі *(array+16)=3 немесе *(array+i+2)=7 түріндегі  адрестік мәндер мен  адрестеу операциясымен байланысты. Мұндай рұқсат алу әдісінде массивтің он алтыншы элементінің адресіне тең адрестік өрнек келесі түрду жазылуы мүмкін :

*(array+16) или *(16+array).

Компьютерде жүзеге асыру барысында бірінші әдіс екінші әдіске келтіріледі, яғни, индекстік өрнек адрестік өрнекке түрленеді. Келтірілген array[16] және 16[array] мысалдары *(array+16) түріне тұрленеді.

Массивтің бастапқы элементіне  рұқсат алу үшін (яғни нөлдік индексті элементке), тек array немесе ptr нұсқауыштарының мәнін қолдануға болады. Келесі меншіктеулердің кез келгені

       *array = 2;

       array[0] = 2;

       *(array+0) = 2;

       *ptr = 2;

       ptr[0] = 2;

       *(ptr+0) = 2;

Массивтің алғашқы элементіне 2 мәнін меншіктейді, бірақ, *array=2 және *ptr=2 меншіктеулері жылдам орындалады, себебі, оларда қосу  операторларын орындау  қажет емес.