Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Указатели в качестве параметров функций






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

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)

}

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

(заголовочные файлы alloc.h, stdlib.h, mem.h; в Visual Studio – memory.h, stdlib.h)

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

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

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

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

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

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

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

Пример организации простейшего массива указателей на произвольные объекты.

#include < stdio.h>

#include < conio.h>

#include < memory.h>

#include < stdlib.h>

 

struct voidarray

{

void **data;

int size, topsize, step;

};

int init(voidarray*array, int initsize)

{

array-> topsize = array-> step = initsize;

array-> size=0;

array-> data=(void**)malloc(initsize*sizeof(void*));

return array-> data! =NULL;

}

int add(voidarray*array, void* element)

{

array-> size++;

if (array-> size> array-> topsize)

{

void **data2=(void**)malloc((array-> topsize+array-> step)*sizeof(void*));

if (data2==NULL) return -1;

memcpy(data2, array-> data, array-> topsize*sizeof(void*));

array-> topsize+=array-> step;

free(array-> data);

array-> data=data2;

}

array-> data[array-> size-1] = element;

return 0;

}

void dispose(voidarray*array)

{

free(array-> data);

array-> size = array-> topsize = 0;

}

 

void* getat(voidarray*array, int n) {return n< array-> size? array-> data[n]: 0; }

 

int main()

{

voidarray array;

init(& array, 10);

for(int i=0; i< 100; i++)

{add(& array, new int(i)); }

for(int i=0; i< 100; i++)

printf(" %d", *(int*)getat(& array, i));

dispose(& array);

_getch();

}






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.