Лекции (1171139), страница 13

Файл №1171139 Лекции (Лекции) 13 страницаЛекции (1171139) страница 132020-04-27СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 13)

Перед именем указателя при описании ставится звездочка, чтобыотличить его от обычной переменной. Примеры описаний указателей:int *a, *b, c, d;char *e;void *f;В первой строке описаны указатели a и b на тип int и простые переменныe c и d типа int (cи d - не указатели!). С указателями возможны следующие два действия:присвоить указателю адрес некоторой переменной.

Для этого используется операция взятия адреса,которая обозначается амперсандом &. Например, строкаa = &c;указателю a присваивает значение адреса переменной c;2. получить объект, адрес которого содержится в указателе; для этого используется операциязвездочка '*', которая записывается перед указателем.

(Заметим, что звездочкой обозначается такжеоперация умножения.) Например, строкаd = *a;присваивает переменной d значение целочисленной переменной, адрес которой содержится в a. Таккак ранее указателю a был присвоен адрес переменной c, то в результате переменной dприсваивается значение c, т.е. данная строка эквивалентна следующей:d = c;1.Описание указателейКонструкции массива и указателя при описании типа можно применять многократно впроизвольном порядке.

Кроме того, можно описывать прототип функции. Таким образомможно строить сложные описания вроде "массив указателей", "указатель на указатель","указатель на массив", "функция, возвращающая значение типа указатель", "указатель нафункцию" и т.д.

Правила здесь таковы:приоритеты конструкций описания распределены следующим образом:операция * определения указателя имеет самый низкий приоритет. Например, описаниеint *x[10];означает "массив из 10 элементов типа указатель на int". Здесь к имени переменной x сначалаприменяется операция определения массива [] (квадратные скобки), поскольку она имеет болеевысокий приоритет, чем звездочка. Затем к полученному массиву применяется операцияопределения указателя.

В результате получается "массив указателей", а не указатель на массив!Если нам нужно определить указатель на массив, то следует использовать круглые скобки приописании:int (*x)[10];Здесь к имени x сначала применяется операция * определения указателя;операции определения массива [] (квадратные скобки после имени) и определения функции(круглые скобки после имени) имеют одинаковый приоритет, более высокий, чем звездочка.Примеры:int f();Описан прототип функции f без аргументов, возвращающей значение типа int.int (*f())[10];Описан прототип функции f без аргументов, возвращающей значение типа указатель на массив из10 элементов типа int;последний пример уже не является очевидным.Общий алгоритм разбора сложного описания можно охарактеризовать как чтение изнутри.

Сначаланаходим описываемое имя. Затем определяем, какая операция применяется к имени первой. Если неткруглых скобок для группировки, то это либо определение указателя (звездочка слева от имени), либоопределение массива (квадратные скобки справа от имени), либо определение функции (круглые скобкисправа от имени). Таким образом получается первый шаг сложного описания. Затем находим следующую46операцию описания, которая применяется к уже выделенной части сложного описания, и повторяем это дотех пор, пока не исчерпаем все описание.При описании указателя модификатор const, записанный до звездочки, означает,что описан указатель на константный объект, т.е. на объект, менять который нельзя илизапрещено. Например, в строке:const char *p;описан указатель на константную строку (массив символов, менять который запрещено).Указатели на константные объекты используются в Си чрезвычайно часто.

Причинасостоит в том, что константный указатель позволяет прочесть объект и при этомгарантирует, что объект не будет испорчен в результате ошибки программирования, т.к.константный указатель не дает возможности изменить объект.Константный указатель ссылается на константный объект, однако, содержимое самогоуказателя может изменяться. Например, следующий фрагмент вполне корректен:const char *str = "e2e4";.

. .str = "c7c5";Здесь константный указатель str сначала содержит адрес константной строки "e2e4". Затемв него записывается адрес другой константной строки "c7c5".В Си можно также описать указатель, значение которого не может быть изменено; дляэтого модификатор const указывается после звездочки. Например, фрагмент кода:int i;int * const p = &i;навечно записывает в указатель p адрес переменной i, перенаправить указатель p надругую переменную уже нельзя. Строка:p = &n;является ошибкой, т.к. указатель p - константа, а константе нельзя присвоить новоезначение.

Указатели, значения которых изменять нельзя, используются в Си значительнореже, в основном при заполнении константных таблиц.Представление через указатели матриц и многомерных массивовСпециального типа данных матрица или многомерный массив в Си нет, однако,можно использовать массив элементов типа массив. Например, переменная a представляетматрицу размера 3×3 с вещественными элементами:double a[3][3];Для обращения к элементу матрицы надо записать его индексы в квадратныхскобках, например, выражение a[i][j] представляет собой элемент матрицы a в строке синдексом i и столбце с индексом j. Элемент матрицы можно использовать в любомвыражении как обычную переменную (например, можно читать его значение илиприсваивать новое).Такая реализация матрицы удобна и максимально эффективна с точки зрениявремени доступа к элементам.

У нее только один существенный недостаток: так можнореализовать только матрицу, размер которой известен заранее. Язык Си не позволяетописывать массивы переменного размера, размер массива должен быть известен до началаработы программы еще на стадии компиляции.Пусть нужна матрица, размер которой определяется во время работы программы.Тогда пространство под нее надо захватывать в динамической памяти с помощьюфункции malloc языка Си. При этом в динамической памяти захватывается линейныймассив и возвращается указатель на него. Рассмотрим вещественную матрицу размером mстрок на n столбцов.

Выделение памяти выполняется с помощью функции malloc языкаСи:double *a;. . .a = (double *) malloc(m * n * sizeof(double));При этом считается, что элементы матрицы будут располагаться в массивеследующим образом: сначала идут элементы строки с индексом 0, затем элементы строки47с индексом 1 и т.д., последними идут элементы строки с индексом m − 1. Каждая строкасостоит из n элементов, следовательно, индекс элемента строки i и столбца j в линейноммассиве равен i * n + j (действительно, поскольку индексы начинаются с нуля, то i равноколичеству строк, которые нужно пропустить, i * n - суммарное количество элементов впропускаемых строках; число j равно смещению внутри последней строки).

Такимобразом, элементу матрицы в строке i и столбце j соответствует выражение a[i * n + j].Этот способ представления матрицы удобен и эффективен. Его основное преимуществосостоит в том, что элементы матрицы хранятся в непрерывном отрезке памяти. Вопервых, это позволяет оптимизирующему компилятору преобразовывать текстпрограммы, добиваясь максимального быстродействия; во-вторых, при выполнениипрограммы максимально используется механизм кеш-памяти, сводящий к минимумуобращения к памяти и значительно ускоряющий работу программы.В некоторых книгах по Си рекомендуется реализовывать матрицу как массивуказателей на ее строки, при этом память под каждую строку выделяется отдельно вдинамической памяти:double **a; // Адрес массива указателейint m, n;// Размеры матрицы: m строк, n столбцовint i;.

. .// Захватывается память под массив указателейa = (double **) malloc(m * sizeof(double *));for (i = 0; i < m; ++i) {// Захватывается память под строку с индесом ia[i] = (double *) malloc(n * sizeof(double));}После этого к элементу a ij можно обращаться с помощью выражения a[i][j].Несмотря навсю сложность этого решения, никакого выигрыша нет, наоборот, программа проигрываетв скорости.

Причина состоит в том, что матрица не хранится в непрерывном участкепамяти, это мешает как оптимизации программы, так и эффективному использованиюкеш-памяти.Многомерные массивы реализуются аналогично матрицам. Например,вещественный трехмерный массив размера 4 × 4 × 2 описывается как: doublea[4][4][2];обращение к его элементу с индексами x, y, z осуществляется с помощью выраженияa[x][y][z]Многомерные массивы переменного размера с числом индексов большим двухвстречаются в программах довольно редко, но никаких проблем с их реализацией нет: ониреализуются аналогично матрицам. Например, пусть надо реализовать трехмерныйвещественный массив размера m × n × k. Захватывается линейный массив вещественныхчисел размером m * n * k:double *a;. . .a = (double *) malloc(m * n * k * sizeof(double));Доступ к элементу с индексами x, y, z осуществляется с помощью выражения a[(x * n +y) * k + z].Арифметика указателейС указателями можно выполнять следующие операции:•••сложение указателя и целого числа, результат - указатель;увеличение или уменьшение переменной типа указатель, что эквивалентно прибавлению иливычитанию единицы;вычитание двух указателей, результат - целое число.Прибавление к указателю p целого числа n означает увеличение адреса, которыйсодержится в переменной p, на суммарный размер n элементов того типа, на которыйссылается указатель.

Характеристики

Тип файла
PDF-файл
Размер
1,27 Mb
Материал
Тип материала
Высшее учебное заведение

Список файлов лекций

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6525
Авторов
на СтудИзбе
301
Средний доход
с одного платного файла
Обучение Подробнее