![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Указатели в качестве параметров функций
В списке формальных параметров функций указатели могут указываться как с использованием символа *, так и с использованием квадратных скобок. Данные определения равнозначны. 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(); }
|