Essays.club - Получите бесплатные рефераты, курсовые работы и научные статьи
Поиск

Тип void

Автор:   •  Ноябрь 13, 2020  •  Доклад  •  1,191 Слов (5 Страниц)  •  239 Просмотры

Страница 1 из 5

2.3.4 Тип void

Тип void синтаксически эквивалентен основным типам, но использовать его можно только в

производном типе. Объектов типа void не существует. С его помощью задаются указатели на объекты неизвестного типа или функции, невозвращающие значение.

void f(); // f не возвращает значения

void* pv; // указатель на объект неизвестного типа

Указатель произвольного типа можно присваивать переменной типа void*. Тип void* имеют также бестиповые объекты, возвращаемые функциями. Для использования таких объектов нужно выполнить явную операцию преобразования типа. Такие функции обычно находятся на самых нижних уровнях системы, которые управляют аппаратными ресурсами. Приведем пример:

void* malloc(unsigned size);

void free(void*);

void f() // распределение памяти в стиле Си

{

 int* pi = (int*)malloc(10*sizeof(int));

 char* pc = (char*)malloc(10);

 //...

 free(pi);

 free(pc);

}

Обозначение: (тип) выражение - используется для задания операции преобразования выражения к типу, поэтому перед присваиванием pi тип void*, возвращаемый в первом вызове malloc(),

преобразуется в тип int.

2.3.5 Указатели

Для большинства типов T указатель на T имеет тип T*. Это значит, что переменная типа T* может хранить адрес объекта типа T. Указатели на массивы и функции, к сожалению, требуют более сложной записи:

int* pi;

char** cpp;             // указатель на указатель на char

int (*vp)[10];          // указатель на массив из 10 целых

int (*fp)(char, char*); // указатель на функцию с параметрами

                        // char и char*, возвращающую int

Главная операция над указателями - это косвенное обращение (разыменование), т.е. обращение к объекту, на который настроен указатель. Эту операцию обычно называют просто косвенностью. Операция косвенности * является префиксной унарной операцией. Например:

char c1 = 'a';

char* p = &c1; // p содержит адрес c1

char c2 = *p; // c2 = 'a'

2.3.6 Массивы

Для типа T T[size] является типом "массива из size элементов типа T". Элементы индексируются от 0 до size-1. Например:

float v[3]; // массив из трех чисел с плавающей точкой:

                                     // v[0], v[1], v[2]

int a[2][5]; // два массива, из пяти целых каждый

char* vpc;                     // массив из 32 символьных указателей

Можно следующим образом записать цикл, в котором печатаются целые значения прописных букв:

extern "C" int strlen(const char*); // из <string.h>

char alpha[] = "abcdefghijklmnopqrstuvwxyz";

main()

{

 int sz = strlen(alpha);

 for (int i=0; i<sz; i++) {

 char ch = alpha[i];

 cout << '\''<< ch << '\''

 << " = " <<int(ch)

 << " = 0" << oct(ch)

 << " = 0x" << hex(ch) << '\n';

 }

}

Здесь функции oct() и hex() выдают свой параметр целого типа в восьмеричном и шестнадцатеричном виде соответственно. Обе функции описаны в <iostream.h>.

Очевидно, что строки пригодны только для инициализации символьных массивов; для других типов приходится использовать более сложную запись. Впрочем, она может использоваться и для символьных массивов. Например:

int v1[] = { 1, 2, 3, 4 };

int v2[] = { 'a', 'b', 'c', 'd' };

char v3[] = { 1, 2, 3, 4 };

char v4[] = { 'a', 'b', 'c', 'd' };

Здесь v3 и v4 - массивы из четырех (а не пяти) символов; v4 не оканчивается нулевым символом, как того требуют соглашение о строках и большинство библиотечных функций.

2.3.7 Указатели и массивы

Указатели и массивы в языке Си++ тесно связаны. Имя массива можно использовать как указатель на его первый элемент, поэтому пример с массивом alpha можно записать так:

int main()

{

 char alpha[] = "abcdefghijklmnopqrstuvwxyz";

 char* p = alpha;

 char ch;

 while (ch = *p++)

 cout << ch << " = " << int (ch)

...

Скачать:   txt (12.4 Kb)   pdf (101.6 Kb)   docx (12.9 Kb)  
Продолжить читать еще 4 страниц(ы) »
Доступно только на Essays.club