Строки

Функции работы с указателями и памятью

Указатель на функцию

Массивы в качестве параметров функций

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

void f(char *x, double y[]) {…}

Для передачи многомерных массивов удобно использовать определение типа (служебное слово typedef).

Пример.

typedef int myarray[5][5];

void f(myarray t)

{

}

void main()

{

myarray x;

f(x);

}

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

void f2(const char *t)

{

t[0] = ‘x’; /недопустимо

free(t); //недопустимо, но можно выполнить free((char *)t)

}

Указатель на функцию используется для передачи точки входа в функцию другой функции в качестве аргумента.

тип_функции (*имя_указателя_на_функцию) (спецификация параметров)

В данном курсе подробно не рассматривается.

Заголовочные файлы: stdlib.h, string.h. В некоторых реализациях данные функции могут находиться в других библиотеках, например, mem.h или memory.h.

Тип size_t (определен в stddef.h) представляет подходящий тип для представления размера объектов в областях памяти, а также для хранения указателей при разыменовании элементов массива. Его размер зависит от реализации: на 32-битных платформах его размер может составлять 32 бита, на 64-битных — 64 бита соответственно. Тип size_t является беззнаковым. Этот тип является результатом операнда sizeof. Как правило, можно принимать size_t ≡ unsigned int.

void* malloc(size_t s) — выделение памяти s байт.

void* calloc(size_t n, size_t m) — выделение n элементов по m байт.

void* realloc(void* ptr, size_t ns) — перевыделение памяти.

void free(void* ptr) — освобождение памяти.

int memcmp(const void* s1, const void* s2, size_t n) — сравнивает две области памяти.

void* memcpy(void* dest, const void* src, size_t n) — копирование области памяти n байт из src в dest.

void* memset(void *ptr, int c, size_t n) — запись числа c в память начиная с ptr.

Строкой является массив данных типа char. Используется строка с завершающим нулём, то есть признаком конца строки является символ с кодом «0».

Строки могут инициализироваться текстом, заключенным в двойные кавычки: строковой константой, — которая имеет тип const char*.

char t[] = “Hello, World”;

Функции работы со строками (библиотека string.h):

char *strcat(char *dest, const char *src) — в dest помещается результат объединения dest и src, возвращает ссылку на dest (в dest должно быть достаточно места для помещения результата);

char *strchr(const char *str, int c) — поиск символа «c» в str, результат — ссылка на первый найденный символ или NULL, если символ не найден;

int strcmpconst (char *str1, const char *str2) — посимвольное сравнение строк, возвращает -1, если str1<str2, +1 если str1>str2 и 0 если str1==str2;

char* strcpy(char *dest, char *src) — копирует src в dest, возвращает указатель на dest;

size_t strlen(const char *str) — вычисляет длину строки;

char* strset(char *str, int c) — устанавливает все символы строки в «с», возвращает s, функция неприменима для инициализации строки;

char *strstr(const char *str, const char *substr) — ищет подстроку substr в строке str, поведение аналогично strchr.

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

Пример:

char a[]=”Hello,”;

char b[]=”world!”;

strcat(a,b); //здесь произойдёт ошибка, т. к. в “a” не хватит места //для размещения результата; решением является выделение буфера с //запасом, например char a[128]=”Hello,”

Определены модификации некоторых функций, принимающие в качестве дополнительного аргумента длину строки. Данные функции начинаются с strn вместо str. Это функции strncat, strncmp, strncpy, strnset.

Пример:

char* strncat(char *dest, const char *src, size_t n) — то же, что strcat, но используются первые n символов src.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: