пользователей: 30398
предметов: 12406
вопросов: 234839
Конспект-online
РЕГИСТРАЦИЯ ЭКСКУРСИЯ

Обьединения. Сложные декларации

 

Обьеденения - обьект, который позволяет нескольким данным с разными типами пользоваться одним участком памяти.

Общая форма объявления объединения

union ИмяОбъединения
{
  тип ИмяОбъекта1;
  тип ИмяОбъекта2;
  . . .
  тип ИмяОбъектаn;
};
 

Занимается память, которая равна длине наиболее длинного элемента.

 Обьеденение может хранить одну свою переменную в одно время, при необходимости обьеденения можно переприсвоить, чтобы сработала другая переменная.

Обьеденения используют там, где работают с разными типами данных, при чем обьем этих данных очень большой.

Операции над обьеденениями: 

  • Обьеденение можно присваивать другому обьеденению
  • Можно брать адрес обьеденения
  • Можно получить доступ к элементу обьеденения

Недостатком обьеденений является то, что нужно постоянно отслеживать тип, который хранит обьеденение.


Вси часто могут появляться сложные определения, состоящие из указателей на массивы, указатели на функции, указатели на функции возвращающие указатели на указатели на функции и т.п. В большинстве случаев такие проблемы разрешаются определением нового типа (с помощью typedef).

Самый простоя случай – массивы.

int *a;

Указатель, или массив.

int (*a)[10];

Указатель на массив из десяти элементов типа int

int (*a)();

Указатель на функцию, которая возвращает переменную типа int и не принимает никаких аргументов.

 
int (*a)(int*);

Указатель на функцию, которая принимает указатель на int и возвращает переменную типа int.

int* (*a)(double *);

Указатель на функцию, возвращающую указатель на int и принимающую в качестве аргумента указатель на double.

int* (**a)(float);

Указатель на указатель на функцию, принимающую в качестве аргумента переменную типа float и возвращающую указатель на int. Он может хранить адрес динамически созданного массива указателей на функцию.

double (*a[10])(int, int, int);

Массив указателей на функцию, принимающую три параметра типа int и возвращающую значение типа double.

int* bar(int (*f)(void));

Функция, которая принимает в качестве аргумента указатель на функцию, возвращающую int и не получающую никаких аргументов. Сама функция bar возвращает указатель на int.

int* (*b)(int (void))

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

float bar2(int *(f)(int (void))) {...

Функция, принимающая в качестве аргумента функцию, возвращающую указатель на int и принимающую в качестве аргумента функцию, возвращающую int, у которой нет аргументов. Сама функция возвращает значение типа float.

float (*b2)(int* (int (void)));
Такие сложные определения трудно разбираются и приводят к куче ошибок, поэтому их заменяют на типы данных. Например
int foo2(float *b) {
    return (int)(*b);
}
 
int (*p2)(float*) = foo2;
Могут быть заменены на
typedef int (*foo_type)(float *);
 
foo_type p2a = foo2;
Далее, можно определить новый тип на основе заданного ранее
typedef foo_type (*foo_foo_type)();
Это указатель на функцию без параметров, которая возвращает foo_type, то есть указатель на функцию, которая возвращает int и принимает в качестве параметра переменную типа float*. И использовать указатель вида

17.06.2016; 07:06
хиты: 128
рейтинг:0
для добавления комментариев необходимо авторизироваться.
  Copyright © 2013-2024. All Rights Reserved. помощь