Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Вызов функции должен находиться в левой части присваивания




25) Динамическое распределение памяти

ОС позволяет программе захватывать свободные блоки. Стартовый код создает списки свободных и занятых блоков в куче (В каждой записе о блоке хранится адрес его начала и размер в байтах) Для динамического распр. памяти в стандартной библ.. stdlib.h

Void malloc(t size); t-unsigned int, ф-я malloc пытается захватить в куче блок размером size, возвращает адресс блока, если неудача то возвр. NULL.

new and delete в С++

new — оператор, обеспечивающий выделение динамической памяти в куче. При помощи оператора new[] невозможно напрямую перераспределить уже выделенную память. Для увеличения или уменьшения размера блока памяти нужно выделить новый блок нужного размера, скопировать данные из старой памяти и удалить старый блок.

Оператор delete возвращает память, выделенную оператором new

, обратно в кучу. Вызов delete должен происходить для каждого вызова new, дабы избежать утечки памяти. После вызова delete объект, указывающий на этот участок памяти, становится некорректным и не должен больше использоваться.

Работа с указателями на примере строк

Вывод строки на экран:

#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) << " символов"; }

Сравнение строк:

Функция strcmp

#include ‘string.h’
int strcmp(const char *str1, const char *str2);

Функция strcmp() сравнивает в лексикографическом порядке две строки и возвращает целое значение, зависящее следующим образом от результата сравнения.
Значение Результат сравнения строк
Меньше нуля str1 меньше str2
Нуль str1 равен str2
Больше нуля str1 больше str2
Пример

 

int strcmp(const char *cs, const char *ct)

{

signed char __res;

while (1) {

if ((__res = *cs - *ct++)!= 0 ||!*cs++)

break;

}

return __res;

}

 

 

Конкатенация строк

Код C
  char *strcpy(char *dest, const char *src);
 

Функция копирует содержимое строки src в строку dest, поверх его содержимого и возращает полученную в результате строку dest.

 

Код C
  char *strcat(char *dest, const char *src);
 

Функция присоединяет содержимое строки src в конец строки dest и возращает результат присоединения.

- потому, что для работы функции strlen(const char*) нужно, чтобы строка, передаваемая параметром, сама оканчивалась на '\0', т.к. нуль-терминатор обозначает конец строки.
Реализация strlen может выглядеть так:

Код C
  size_t strlen(const char* str) { size_t n = 0; while(*str++) ++n; return n; }
 

Как видно из реализации, цикл while (подсчет символов) продолжается до тех пор, пока очередной символ не равен '\0'

strncat()
в отличие от strncpy() она всегда присоединяет нуль-символ к результату, в то время как strncpy() не присоединяет, если не доходит до него в копируемой строке, из-за чего его приходится ставить вручную

Удалить последний символ строки

String Text = "Hello World!!";

Text.Delete(Text.Length(),1);

Удаление символов строки #include <string>

erase (size_type pos=0,size_type n=npos) - удаляет n символов с указанной позиции;

erase (iterator p) - удаляет один символ в указанной позиции;

erase (iterator f, iterator l) - удаляет символы с позиции f по l.

Сегмент данных для хранения констант

Директива #define служит для замены часто использующихся констант,

ключевых слов, операторов или выражений некоторыми идентификаторами.

#define имя_макроса последовательность_символов

Функции стандартной библиотеки для работы со строками string.h

char *strcpy(char *dsk, char *src); \\ из src копирует в dsk

int strcmp(char *s1, char *s2); \\ сравнение строк, то что по алф раньше-меньше

char *strcut (char *s1, char *s2); \\ s2 дописывается к s1

сhar *strstr(char *str,char *substr); \\ возвращает указатель на первое вхождение substr в строке str

Функция strchr() возвращает указатель на местонахождение первого совпадения с символом c в строке s... а если символ не найден, то возвращают NULL.

char *numbers = "01233210";
char *three = strchr(numbers, '3');

int strlen(char *s);-длина строки

char *strtok(char * str, char * delim); \\ разбивает фразу на части

Функция strtok

#include <string.h>

char *strtok(char * str1, const char * str2);

Функция strtok() разбивает строку на лексемы. При каждом вызове возвращает адрес первой лексемы

возвращает указатель на следующую лексему в строке, адресуемой параметром str1. Символы, образующие строку, адресуемую параметром str2, представляют собой разделители, которые определяют лексему. При отсутствии лексемы, подлежащей возврату, возвращается нулевой указатель.

Пример

Эта программа разбивает строку "Травка зеленеет, солнышко блестит" на лексемы, разделителями которых служат пробелы и запятые. В результате получится

Травка|зеленеет|солнышко|блестит

#include <stdio.h>

#include <string.h>

 

int main(void)

{

char *p;

 

p = strtok("Травка зеленеет, солнышко блестит", " ");

printf(p);

do {

p = strtok('\0', ", ");

if(p) printf("|%s", p);

} while(p);

 

return 0;

}

 

22) Указатели на функции.

Указатели на функции [1] —Функция располагается в памяти по определенному адресу, который можно присвоить указателю в качестве его значения. Адресом функции является ее точка входа. Именно этот адрес используется при вызове функции. Так как указатель хранит адрес функции, то она может быть вызвана с помощью этого указателя. Он позволяет также передавать ее другим функциям в качестве аргумента.

 

23) Описания в кот. встреч. [],(),* считаются сложными

Пример int *(*f[3])(int, double) 1- имя f. 2-массив в 3х эл. (Если справа () – то функция, если [] то массив)

3- массив из 3х указателей на функцию с 2мя арг. int, double.(Ecли справа от имени есть(), а слева *, то приоритет имеют скобки) 4-тип возвращ. значения вначале int *,т.е. функции возвращ. указатели на int.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...