Хелпикс

Главная

Контакты

Случайная статья





Применение void. Массивы



2. Применение void

 

Ключевое слово void используется как возвращаемый тип функции, не возвращающей значения. Более важное применение void заключается в объявлении типа обобщённого указателя (generic pointer) – указателя на void, например void* gp. Такому указателю можно присвоить адрес переменой любого типа, но он не может быть разыменован. Разыменование – операция *, действующая на значение указателя (адрес) для получение того, на что он указывает. Она не будет иметь смысла при разыменовании указателя на значение void, потому что неизвестно, какого типа информация хранится по адресу указателя. Вот несколько простых примеров использования void:

void* gp;                     //обобщённый указатель

int* ip;                         //указатель на int

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

gp=ip;                          //допустимое преобразование

cp=ip;                          //недопустимое преобразование

*ip=15;                        //допустимое разыменование указателя на целое

*ip=gp;                        //недопустимое разыменование обобщённого указателя

ip=static_cast<int*>(gp); //допустимое преобразование

 

В основном данный тип применяется в качестве формального параметра. Например, библиотечная функция memcpy объявляется в cstring.h как

Void* memcpy (void* s1, void* s2, size_t n);

Эта функция копирует n символов из объекта, размещённого в s2, в объект, размещённый в s1. Она работает с любыми типами указателей в качестве фактических аргументов.

 

3. Массивы

 

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

#include <iostream.h>

const int size = 5;

int main ()

{

int a [size];         //резервируем место для a [0], … , a [4]

int i, sum =0;

for ( i = 0; i < size; ++i ) {

a [i] = i *i;

cout << “a [“ << i << “] = ” << a [i] << “ “;

sum += a [i];

}

cout << “ \nсумма = “ << sum << endl;

}

Результат этой программы выглядит так:

a [0] = 0 a [1] = 1  a [2] = 4   a [3] = 9     a [4] = 16

sum = 30

Вышеприведённому массиву требуется память для хранения пяти целых значений. Так если a [0] хранится по адресу 1000, то в системе, отводящей для хранения целого 4 байта, остальные элементы массива последовательно размещаются по адресам 1004, 1008, 1012 и 1016. Считается хорошей привычкой определять размер массива как символическую константу. Поскольку большая часть кода может зависеть от этого значения, удобно иметь возможность изменять единственную строчку #define для обработки массивов различного размера.



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.