Третья лекция по си++ ФКН ВГУ

Лысачёв Пётр Сергеевич . Лекции по си++
Третья лекция по си++

12 марта.

Продолжение темы про указатели.
Операции с узкателями
int m[4] = {1, 2, 3, 4};
unsigned int* p = m;
unsigned int* d = p;
1) p++;
2) int i = p – d; ( i = 1, p = m[1])
4) *p = 4; (m {1, 4, 3, 4} )
5) p+=2; p--;

ip++; - увеличение на единицу целочисленного указателя.
Изменение указателя на единицу приводит к изменению его значения (смещения) на размер базового типа.

Строки, Символы
Пример строки , которая содержит в себе разделитель строк – «символ новой строки»
1) “Строка1\nСтрока2”
В языке си++ все строки пишутся в двойных ковычках.

2) ‘c’, ‘0’, ‘\0’

Примеры:
Описание указателя на чар и присваивание адреса констанотной строки
1) char* str = “Строка1”; ( const char*)
запись одного символа
2) char ch = ‘c’;
записываем в переменную символа первую букву строки:
3) char ch1 = *str;

При работе со строками следует всегда контролировать размер буфера для строки.

Операции со строками
char* str = “Строка”; // шесть байт под строку
1)int* ip = (int*)str;
ip++; // увеличиваем указатель на единицу – теперь указывает на «к»
( *ip == ‘о’) // фактически записываем целое число (от 0 до 255 – т.к. это символ)
Нельзя: *ip = ‘м’;
2)char* cp = str;
cp++; // теперь указывает на «т»
(*cp == ‘т’)
Нельзя: *cp = ‘м’;

Перебор строки

сhar* p = “Строка”;
while(*p) p++; // пока не ноль - перебираем.

Структура программы (функции)

1) void func()
{
}
2) int func1(void)
{
return 5;
}
3)
bool func2(bool b);

bool func2(bool b)
{
return !b
}

Передача объекта в функцию
Возможно передача как по ссылке(указателю) так и по значению.

В си++ ссылка и указатель это не одно и то же.!!!!!!!!!!
void func(string* p, string& r, string s)
{
*p += 5;
r +=5;
s +=5;
}
string s;
func(&s, s, s); // 1) происходит копирование данных 2) передача ссылки 3) происходит копирование строки.

Разница между сслкой и указателем:
Ссылка:
Тип& имя=значение;

Например:
int i;
i = 5;
int& r = i; // теперь r
r = 10;

Если у нас есть функция, которая в качестве параметра содержит ссылку - то при изменении её значение значение меняется и «снаружу».

Внутри функции получить доступ к оригинальной функции как через ссылку так и через указатель.

Перегрузка функций

То есть мы можем описать две функции с одинаковыми именами и разными параметрами – компилятор в случае корректного кода сам определит по сигнатуре - что именно мы желаем использовать.

void func(int i) // функция 1
{
printf(“%i\n”, i);
}
void func(char c) // функция 2
{
printf(“%c\n”, c);
}
1) func(10); // работает первая функция
2) func(‘c’); // работает вторая функция
3) func((int)‘c’); // работает первая функция
4) func(0); // вызовет ошибку компилятора – он не сможет определить какую именно функцию мы желаем вызвать.
Ограничитель const - также влияет на перегрузку – это следует учитывать.
Как и в си шарпе выбор функции при перегрузке определяется типом передаваемых параметров.

Структуры си++

struct [имя_типа] {
тип1 переменная1;
тип2 переменная2;
………
};

struct {
тип1 переменная1;
тип2 переменная2;
………
} [объекты];