- •2) Константы
- •13) Массивы-конечная совокупность данных одного типа
- •19) Сегмент данных для хранения констант
- •3.14159265 Позволяет использовать в программе имя p1 вместо константы 3.14159265. Обратите внимание, что
- •Void main()
- •32) Перечислимые типы
- •Void constr_list(dyn_list &l)
- •37) Объединения
- •Режимы открытия и их назначение
13) Массивы-конечная совокупность данных одного типа
Имя массива – адрес нулевого элемента
Описание. Элементы не могут быть void, function. Могут быть массивом, указателем.
Инициализация. Можно использовать явную и неявную инициализацию(int x[10], int x[3]={1,2,3})
Z[100]={1,2,3} если описание не полное, то остальные обнуляются. Можно задавать неявно z[]={1,2,3,4,5}; <- (z[5])
Многомерные массивы
double d[2][3]; d[0][0]=1.76; double d[2][3]={1,2,3,4,5,6}; char ch[ ][2]={‘A’, ‘B’, ‘C’, ‘D’};
В многомерном массиве вторая и след. размерности задают тип элементов, влияют на размер массива.
Для многомерных массивов неявно можно задавать только первую размерность.
Передача массивов в функции
Функция может инициализировать массив, прибавить к массиву значения или вывести элементы массива на экран. Когда вы передаете массив в функцию, вы должны указать тип массива. Нет необходимости указывать размер массива. Вместо этого вы передаете параметр например number_of_elements, который содержит количество элементов в массиве void some_function(int array[], int number_of_elements);
14) В C++ можно передавать параметры в функцию по значению (func2) и по ссылке (func1):
void func1 ( A& a ); void func2 ( A a );
Здесь кроется засада: в func2 внутрь функции передается на самом деле не a, а его копия.
Пример,swap
void swap (int x; int y) {
int tmp=x; x=y; y=tmp; }
int main(){
int a=5, b=10;
swap (a,b);
printf(“a=%d\t b=%d\n”,a,b);
…
}
При вызове функции swap создаются 2 локальные переменные(изменяются лок. переменные). Чтобы ф-ия изменяла внешние переменные переменные должны быть или глобальные,либо должны передавать их адреса.
15)
Указатели –это переменная, содержащая адрес памяти или функции. Ук-ли разделяют на данные(типизированные и нет.) и на код(тип.). Базовый_тип *имя;
как хранится в памяти-целое неотрицательное значение; мн-во допустимых значений-допустимые значения адресов
Мн-во допуст. операц. для нетип. указ. явл. подмн-вом мн-ва допуст. опер. для типизиров.
ДЛЯ НЕТИП(void *pv): операц. получения адреса &, =,если в левой части нетипизир указатель, а в правой любой указатель, ==, !=, <, <=, >, >=. int *p,x=5; p=&x; Операция разодресации *р=100;
ДЛЯ ТИП: =, если в левой части тип. указатель, то и в правой части указатель такого же типа. На типиз. указ. на данные разрешена функция индексирования. P [2] эквивалентно записи *(P+2) , *(2+P) = 2[P]
16) 1-Когда нужно работать с конкретным адрессом.
2-Когда функция должна изменять передаваемые ей аргументы. void swap(int *x,int *y) {int tmp=*x;*x=*y;*y=tmp;}
void main() {int a=5, b=10; swap (&a,&b);}
3-Когда мы обр. к функции-ссылке компилятор применяет к адресу операцию разодресацию
(В С++ определен ссылочный тип данных. Ссылка – скрытый указатель) void swap(int &x,int &y) {int tmp=x;x=y;y=tmp;}
void main() {int a=5, b=10; swap (a,b);}
4-Когда ф-я должна возвращать адрес
17)Динамическое распределение памяти
ОС позволяет программе захватывать свободные блоки постранично(4кб) Исполняющая система С Runtime(минимум 4байта) Стартовый код создает списки свободных и занятых блоков в куче (В каждой записе о блоке хранится адрес его начала и размер в байтах) Для динамического распр. памяти в стандартной библ. есть 4 функции. stdlib.h
void malloc(t size); t-unsigned int, ф-я malloc пытается захватить в куче блок размером size, возвращает адресс блока, если неудача то возвр. NULL.
new and delete в С++
new — оператор, обеспечивающий выделение динамической памяти в куче. При помощи оператора new[] невозможно напрямую перераспределить уже выделенную память. Для увеличения или уменьшения размера блока памяти нужно выделить новый блок нужного размера, скопировать данные из старой памяти и удалить старый блок.
Оператор delete возвращает память, выделенную оператором new, обратно в кучу. Вызов delete должен происходить для каждого вызова new, дабы избежать утечки памяти. После вызова delete объект, указывающий на этот участок памяти, становится некорректным и не должен больше использоваться.
18)Работа с указателями на примере строк
Вывод строки на экран:
#include <iostream.h>
void show_string(char *string)
{ while (*string != '\0')
{ cout<<*string; string++; } }
void main(void)
{ show_string("Учимся программировать на языке C++!"); }
Определения количества символов в строке:
#include <iostream.h>
int string_length(char *string)
{ int length = 0; while (*string != '\0')
{ length++; string++; } return(length); }
void main(void)
{ char title[] = "Учимся программировать на языке C++"; cout << title << " содержит " << string_length(title) << " символов"; }
Сравнение строк:
int strcmp(const char *cs, const char *ct)
{
signed char __res;
while (1) {
if ((__res = *cs - *ct++) != 0 || !*cs++)
break;
}
return __res;
}
Сравнение строк
Для лексикографического сравнения строк используются функции strcmp и
stricmp. Первая сравнивает строки с учетом регистра, вторая – без. Однако, все
это относится только к латинице. Если вы хотите сравнивать без учета регистра
кириллические строки, придется разобраться с локалями.
Прототипы этих функций таковы:
int stricmp(const char *string1, const char *string2);
int strcmp(const char *string1, const char *string2); Обе функции возвращают число меньшее 0, если первая строка меньше второй,
большее нуля если первая строка больше второй и 0, если строки
лексикографически равны.
Полагаю, вам не придет в голову сравнивать строки, используя операции ‘<’ и ‘>’.
Конкатенация строк
char* strcat(char* dest, const char* source) char* strncat(char* dest, const char* source, size_t size) |
Эти функции добавляют к строке, на которую указывает dest, символы из строки source. Первая версия добавляет все символы до нуль-терминатора, вторая – максимум size символов. Результирующая строка завершается нуль-терминатором.
Удалить последний символ строки
String s = "aljfhwfhgc vwiu"; s.Delete(10, 5);//s = "aljfhwfhgc"
Удаление символов строки #include <string>
erase (size_type pos=0,size_type n=npos) - удаляет n символов с указанной позиции;
erase (iterator p) - удаляет один символ в указанной позиции;
erase (iterator f, iterator l) - удаляет символы с позиции f по l.
