Функции работы с указателями и памятью
Указатель на функцию
Массивы в качестве параметров функций
В списке формальных параметров функций указатели могут указываться как с использованием символа *, так и с использованием квадратных скобок. Данные определения равнозначны.
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.