Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции.docx
Скачиваний:
14
Добавлен:
23.03.2015
Размер:
63.56 Кб
Скачать

Унарные операции получения адреса ссылки

Унарная операция применима к величинам имеющим имя и размещённым в озу. ТО нельзя получить адрес скалярного выражения не именованной const.

Взаимосвязь между указателями и массивами

Массивы и указатели взаимосвязаны и почти эквивалентны друг другу. Имя указателя можно понимать как константный указатель. Его можно использовать для выполнения любой операции, включая индексирование массива. Нотация – описание какого-либо слов, элемента.

Используйте нотацию массивов, а не нотацию указателей при манипуляции массивами. Прога будет длиннее, но более понятна.

int b[5];

bPtr=b

это эквивалентно присваиванию адреса первого эл массива след образом:

bPtr=&b[0];

Ссылаться на эл массива b[3]: *(bPtr+3), где 3 смещение.

Когда указатель указывает на начало массива, смещение указ на какой эл массива должна быть ссылка, так что значение смещения эквивалентно индексу массива.

Предыдущую запись называют запись указатель-смещение. Приоритет * выше, чем у «+». Так как эл массива мб указан указателем выражение «&b[3]» может быть записано по-другому bPtr+3

Сам массив можно рассматривать как указатель и исп в арифметике указателей *(b+3) тоже ссылается на эл массива b[3]. Все выражения с индексами массива могут быть записаны с помощью указателей и смещения. В этом случаи запись указатель смещение применялась бы к имени массива как к указателю. Важно что *(b+3) не модифицирует имя массива; b – первый эл массива.

Указатели можно индексировать также как и массив. bPtr[1]=b[1]. Это выражение как запись-указатель-индекс. b+=3 разрешено, так как оно пытается модифицировать значение имени массива с помощью арифметических операций. Имена массивов модифицировать нельзя.

Найти определитель 3–х мерной матрицы.

Указатели на указатели

*ptr

*ptr

*ptr

Строка 1

Строка 2

Строка 3



*Ptr Содержит адрес массива указателя.

Char**pp(Содержит адрес массиве указателей на строки) размер массива int size=0. Нам необходимо написать ф-цию, которая будет выделять динамическую память для новых элементов массива указателей и для хранения символов новых строк. Эта ф-ция будет принимать как параметры указатель на указатель, размер массива указателя и строку, которую надо будет записать в выделенную под неё память. В строке 6 **AddPtr объявляем прототип функции. Перед название ф-ции ставим**, так как ф-ция будет возвращать указатель на указатель. В главной ф-ции создаём указатель на указатель типа Char **pp, который изначально не на что не указывает и счётчик элементов массивов указателей size. Далее идёт поочерёдное наращивание массива указателей и добавления в него данных посредством ф-ции AddPtr. При этом каждый раз после вызова ф-ции мы увелич сайз на 1. В виде параметра ф-ции AddPtr будет принимать объявленный указатель на указатель иопр нами строку. При первом вызове ф-ции придаётся значение 0, срабатывает if, в котором мы выделяем динамическую память для 1 эл массива указателей pp=new char *[size+1]. ВСЁ, ЧТО МЫ ПИШЕМ, ОПИСАНО В КОМЕНТАРИЯХ ПРОГРАММЫ «YKAZATELINAYKAZATELY», ПОЭТОМУ Я НЕ БУДУ ПИСАТЬ ЭТУ Х&&НЮ!!!



Классы в с++

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

Методы — это функции, которые могут выполнять какие-либо действия над данными (свойствами) класса. Добавим в наш класс функцию calculate_average_ball(), которая будет определять средний балл успеваемости ученика.

Модификаторы доступа public и private

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

Закрытые данные класса размещаются после модификатора доступа private. Если отсутствует модификатор public, то все функции и переменные, по умолчанию являются закрытыми (как в первом примере).

Обычно, приватными делают все свойства класса, а публичными — его методы. Все действия с закрытыми свойствами класса реализуются через его методы. Рассмотрим следующий код.

class Students {

public:

// Установка среднего балла

void set_average_ball(float ball)

{

average_ball = ball;

}

// Получение среднего балла

float get_average_ball()

{

return average_ball;

}

std::string name;

std::string last_name;

int scores[5];

private:

float average_ball;

};

Мы не можем напрямую обращаться к закрытым данными класса. Работать с этими данными можно только посредством методов этого класса. В примере выше, мы используем функцию get_average_ball() для получения средней оценки студента, и set_average_ball() для выставления этой оценки.

Функция set_average_ball() принимает средний балл в качестве параметра и присваивает его значение закрытой переменной average_ball. Функция get_average_ball() просто возвращает значение этой переменной.