Массивы и указатели
Имя массивавоспринимается двояко на этапе определения массива и на этапе его использования. С одной стороны имя массива следует рассматривать как имя структурированной переменной. И применение таких операций как sizeof и & к имени массива дают в качестве результата соответственно размер внутреннего представления в байтах всего массива и адрес первого элемента массива: sizeof(имя массива) – размер массива; &имя массива - адрес массива в целом, равный адресу первого элемента. С другой стороны имя массива - это константный указатель, значением которого является адрес первого элемента массива и значение данного указателя нельзя изменять. Рассмотрим одномерный массив. В соответствии с вышесказанным соблюдается равенство: имя_массива = = &имя_массива = = &имя_массива[0], то есть, имя массива отожествляется с адресом массива в целом и с адресом его первого элемента. Данные соотношения позволяют сформулировать еще один способ обращения к элементам массива. В соответствии с операцией сложения указателя с целым числом, если к имени массива (константному указателю) прибавить целое число i: имя_массива +i, то на машинном уровне сформируется следующее значение адреса: имя_массива + i * sizeof(тип элемента), которое равно адресу i - го элемента массива: имя_массива + i = = &имя_массива[ i ]. Операция разыменования адреса объекта предоставляет доступ к самому объекту. Применяя операцию разыменования для левой и правой части представленного выше уравнения, получаем результат: *(имя_массива + i) = = имя_массива [ i ], из которого следует, что обращаться к i-му элементу массива можно любым из этих эквивалентных способов. Многомерные массивы рассмотрим на примере объявления двумерного массива: type T [m][n]; m, n – целочисленные константы, type – тип элемента массива. В массиве m строк по n элементов в строке (n столбцов ). Имя двумерного массива T также отожествляется с его адресом, а также с адресом его первого элемента Т[0][0]. Каждая строка двумерного массива - это одномерный массив с именем T[i], где i – индекс строки, и имя этого массива является адресом первого элемента строки и адресом строки в целом. Адреса строк массива равны: T[0], T[1],…,T[m-1], и, как показано выше, эквивалентны следующим выражениям: * T, *(T+1),…,*(T+m-1). Выражения: T[i] = = *(T+i) = =&T[i][0] – представляют адрес i – строки массива, и, следовательно, обращаться к элементу i –ой строки j-го столбца массива можно следующими способами: T[i][j] = = *(*(T+i)+j)==*(T[i]+j)==(*(T+i))[j]
|