Главная страница
Навигация по странице:

  • Индексы

  • Алгоритмизации


    Скачать 1.15 Mb.
    НазваниеАлгоритмизации
    Дата27.09.2022
    Размер1.15 Mb.
    Формат файлаdocx
    Имя файла12_100229_1_124427 (1).docx
    ТипДокументы
    #700459
    страница16 из 67
    1   ...   12   13   14   15   16   17   18   19   ...   67

    Одномерныемассивы


    В программе одномерный массив объявляется следующим образом:

    тип ID_массива[размер] = {список начальных значений};

    тип базовый тип элементов массива (целый, вещественный, символьный);

    размер количество элементов в массиве.
    Список начальных значений используется при необходимости инициализировать данные при объявлении, он может отсутствовать.

    При декларации массива можно использовать также атрибуты «класс памяти» и const.

    Размер массива вместе с типом его элементов определяет объем памяти, необходимый для размещения массива, которое выполняется на этапе компиляции, поэтому размер массива задается только константой или константным выражением. Нельзя задавать массив переменного размера, для этого существует отдельный механизм – динамическое выделение памяти.

    Пример объявления массива целого типа: int a[5];

    ИндексымассивоввязыкеСиначинаютсяс0, т.е. в массиве а

    первый элемент: а[0], второй а[1], пятый а[4].

    Обращение к элементу массива в программе на языке Си осуществляется в традиционном для многих других языков стиле записи операции обращения по индексу [] (квадратные скобки), например:

    a[0]=1;

    a[i]++; a[3]=a[i]+a[i+1];

    Пример объявления массива целого типа с инициализацией начальных значений:

    int a[5]={2, 4, 6, 8, 10};

    Если в группе {…} список значений короче, то оставшимся элементам присваивается 0.

    Внимание. В языке Си с целью повышения быстродействия программы отсутствует механизм контроля выхода за границы индексов массивов. При необходимости такой механизм должен быть запрограммирован явно.

      1. Связьуказателейимассивов


    Идентификатор одномерного массива это адрес памяти, начиная с которого он расположен, т.е. адрес его первого элемента. Таким образом, работа с массивами тесно взаимосвязана с применением указателей.

    Рассмотрим связь указателей с элементами одномерного массива на примере.

    Пусть объявлены одномерный целочисленный массив aиз 5 элементов и указатель p на целочисленные переменные:

    int a[5]={1, 2, 3, 4, 5}, *p;

    IDмассива aявляется константным указателем на его начало, т.е. а = &a[0] – адрес начала массива. Расположение массива а в оперативной памяти, выделенной компилятором, может выглядеть следующим образом:


    a[0] a[

    1] a[2] a

    [3] a[4]

    элеме

    нты мас

    1

    2

    3

    4

    5

    4000

    4002

    4004

    4006

    4008



    сива;

    • значения элементов массива;

    • символические адреса.


    Указатель асодержит адрес начала массива и в нашем примере равен 4000 (а=

    = 4000).

    Если установить указатель рна объект а, т.е. присвоить переменной- указателю адрес первого элемента массива:

    р= а;

    что эквивалентно выражению р= &a[0]; то получим, что и р = 4000. Тогда с учетом адресной арифметики обращение к i-му элементу массива а может быть записано следующими выражениями:

    а[i] � *(а+i) � *(р+i) р[i] ,

    приводящими к одинаковому результату.

    Идентификаторы аи р указатели, очевидно, что выражения а[i] и

    *(а+i) эквивалентны. Отсюда следует, что операция обращения к элементу массива по индексу применима и при его именовании переменной- указателем. Таким образом, для любых указателей можно использовать две эквивалентные формы выражений для доступа к элементам массива: р[i] и

    *(р+i). Первая форма удобнее для читаемости текста, вторая – эффективнее по быстродействию программы.

    Например, для получения значения 4-го элемента массива можно написать а[3] или *(а+3), результат будет один и тот же, а операции a[3] = 8 и *(р+3) = 8 дадут тождественный результат, т.к. р+3 = 4000+3*sizeof(int) =

    = 4000+3*2 = 4006, т.е. указатель рустановлен на четвертый по счету элемент массива.

    Очевидна и эквивалентность выражений:

    • получение адреса начала массива в ОП: &а[0]&(*а)а

    • обращение к первому элементу массива:

    *а а[0]

    Последнее утверждение объясняет правильность выражения для получения количества элементов массива:

    int x[]={1, 2, 3, 4, 5, 6, 7};

    Размер nдолжен быть целочисленной константой: int n = sizeof(x) / sizeof(*x);
      1. 1   ...   12   13   14   15   16   17   18   19   ...   67


    написать администратору сайта