Указатель тип данных: Тип данных указателя в C++

c++ — Зачем указателю нужно знать, какой тип хранится по адресу?

Вопрос задан

Изменён 4 года назад

Просмотрен 324 раза

Собственно, зачем мы пишем тип данных перед объявлением переменной-указателя? Если указатели хранят адрес ячейки, то какое им дело, что лежит по этому адресу?

  • c++
  • указатели

14

Собственно зачем мы пишем тип данных перед объявлении переменной-указателя?

Собственно за тем же, зачем мы указываем тип переменной. Когда приходит время работать с разъименованным указателем (то есть с переменной), то транслятору нужно знать какой это тип, чтобы правильно применять операции к этому типу.

Если указатели хранят адрес ячейки то какое им дело что лежит по этому адресу?

Пока указатели просто хранят адрес им (то есть транслятору) все равно. Но когда начинается использование данных по этому адресу, то транслятору нужно знать тип этих данных.

UPD1:

Нужно понимать, что (к примеру) когда суммируются два целых (int) числа, то транслятор вызывает одну функцию. А когда суммируются два float числа, то транслятор вызывает совсем другую функцию. Поэтому в программировании важна не только информация об операциях над переменными, но и также не менее важна информация об типах этих переменных.

2

Скорее, чтобы компилятор знал с какими данными он работает,и как с ними можно манипулировать. Чтоб при разыменовывании указателя знать на какую память он ссылается — размер типа(байты). Всё таки C++ — статически типизированный язык программирования.

Считается, что указателями сложно управлять. Довольна часто неверная инициализация указателей приводит к ошибкам, которые трудно обнаружить. Если компилятор будет знать, какой тип данных будет хранится по указателю, то некоторые ошибки можно будет избежать.

Также при инкрементировании указателя, программа должна знать размер типа данных на который указывает указатель.

Если не хотите объявлять тип указателя, то всегда можно использовать пустой тип void.

Если представить, что тип переменной — это улица, а значение переменной — это собственно номер квартиры, тогда можно понять, зачем нужет тип. Компилятор не в состоянии найти квартиру без адреса, + ко всему типы данных очень сильно влияет на функционал переменной. Поэтому и нужно использовть тип данных при инициализации переменной-указателя.

Зарегистрируйтесь или войдите

Регистрация через Google

Регистрация через Facebook

Регистрация через почту

Отправить без регистрации

Почта

Необходима, но никому не показывается

Отправить без регистрации

Почта

Необходима, но никому не показывается

Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки

1.

2.4. Указатели | Электроника для всех

Содержание
Возврат к предыдущей части 1.2.3 Числа с плавающей запятой

Указатель — это адрес памяти, распределяемой для размещения идентификатора (в качестве идентификатора может выступать имя переменной, массива, структуры, строкового литерала). В том случае, если переменная объявлена как указатель, то она содержит адрес памяти, по которому может находится скалярная величина любого типа. При объявлении переменной типа указатель, необходимо определить тип объекта данных, адрес которых будет содержать переменная, и имя указателя с предшествующей звездочкой (или группой звездочек). Формат объявления указателя:

спецификатор-типа [ модификатор ] * описатель .

Спецификатор-типа задает тип объекта и может быть любого основного типа, типа структуры, смеси (об этом будет сказано ниже). Задавая вместо спецификатора-типа ключевое слово void, можно своеобразным образом отсрочить спецификацию типа, на который ссылается указатель. Переменная, объявляемая как указатель на тип void, может быть использована для ссылки на объект любого типа.

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

В качестве модификаторов при объявлении указателя могут выступать ключевые слова const, near, far, huge. Ключевое слово const указывает, что указатель не может быть изменен в программе. Размер переменной объявленной как указатель, зависит от архитектуры компьютера и от используемой модели памяти, для которой будет компилироваться программа. Указатели на различные типы данных не обязательно должны иметь одинаковую длину.

Для модификации размера указателя можно использовать ключевые слова near, far, huge.

Пример:

   unsigned int * a; /* переменная  а  представляет собой указатель
                     на тип unsigned int (целые числа без знака) */

   double * x;       /* переменная  х  указывает  на  тип  данных с
                     плавающей  точкой  удвоенной  точности      */

   char * fuffer ;   /*  объявляется  указатель с именем fuffer
                      который указывает на  переменную типа char */

   double nomer;
   void *addres;
   addres = & nomer;
   (double *)addres ++;

  /* Переменная addres объявлена как указатель на объект любого типа.  
 Поэтому ей можно присвоить адрес любого объекта (& - операция  вычисления 
 адреса). Однако, как было отмечено выше, ни одна арифмитическая операция не может
  быть  выполнена над указателем,  пока   не будет явно определен тип данных,  
 на которые он указывает. Это   можно сделать,  используя операцию приведения типа
  (double *) для   преобразования addres к указателю на тип double, а затем  увеличение адреса. */

    const * dr;

  /* Переменная  dr  объявлена как указатель на константное выражение, т.е. значение 
 указателя может изменяться в процессе   выполнения программы, а величина, на которую
 он указывает, нет. */

    unsigned char * const w = &obj.

  /* Переменная w объявлена как константный указатель на данные типа char unsigned. 
  Это означает, что на протяжение всей программы  w  будет указывать на одну и ту же 
 область памяти.  Содержание же   этой области может быть изменено.
*/

Читать далее. Раздел 1.2.5 Перечислимый тип
Содержание

Какой тип данных у указателя в c?

спросил

Изменено 1 год, 6 месяцев назад

Просмотрено 40 тысяч раз

являются указателями целочисленного или беззнакового типа данных?

  • c
  • указатели

2

Нет. Это указатели, размер которых зависит от системы и единственный совместимый тип — void* .

8

Указатели относятся к типу указателей. Если вы спрашиваете о том, как значения указателя представлены в памяти, это действительно зависит от платформы. Это могут быть простые целочисленные значения (как в плоской модели памяти), или они могут быть структурированными значениями, такими как номер страницы и смещение (для сегментированной модели), или они могут быть чем-то совершенно другим.

В C указатель может обращаться к переменным любых типов данных. Указатель должен быть объявлен с типом данных переменной, на которую будет указывать указатель. Чтобы распечатать адрес указателя в шестнадцатеричном формате, используйте %p , а для печати адреса в других формах используйте %u . Если указатель будет использоваться для отображения значения указывающей переменной, используйте *pointer_name и только для адреса используйте pointer_name .

Я считаю, что указатели сами по себе являются типами данных. Это мое убеждение пришло из книги, написанной Брайаном Керниганом и Деннисом Ритчи, 2-е издание из вводной части, в которой говорится, что —

BCPL и B являются «бестиповыми» языками. Напротив, C предоставляет множество типы данных. Основными типами являются символы, а также целые числа и числа с плавающей запятой нескольких размеров. Кроме того, существует иерархия производных типов данных, созданных с помощью указателей, массивов, структур и объединений.

Пожалуйста, обсудите или поделитесь своим мнением.

Справочник по языку программирования c Денниса Ричи

int *p;

тип данных *p является указателем. И он указывает на переменную целочисленного типа. Он хранит адрес в шестнадцатеричном формате.

1

Указатели на любой тип данных, будь то char/int/float/double/…, являются только целыми числами без знака.

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

2

Каков тип данных указателя в C? это уникальный вопрос.

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

Ответ.

  1. Как называется тип данных набора целых чисел в C? Имя — int — это имя набора, состоящего из всех допустимых целых чисел. Следовательно, мы объявляем int x; где x может принимать любое значение из множества.

  2. Аналогично, как называется набор всех допустимых адресов или указателей? .Имя набора может быть только символом ‘*’, как я понимаю, хотя нигде в повествованиях на языке C нет никаких объяснений.

Следовательно, мы объявляем переменную-указатель как *x; где * — имя типа данных. В противном случае, зачем думать о типе данных указателя и помещать его в тип данных, определяемый пользователем. Поскольку имеются все ячейки ОЗУ, тип данных ‘*’ образует подмножество допустимых и доступных ячеек памяти. Следовательно, это имя типа данных набора указателей.

int — это модификатор, как в signed char c; где signed — это модификатор в C. Следовательно, у нас может быть int *x; означает, что данные в расположении представляют собой целое число, которое является необходимой информацией для компилятора.

C говорит о типе данных указателя как о пользовательском типе данных. Возможно, неправильно рассматривать тип данных указателя как пользовательский тип данных, поскольку пользователь не имеет контроля над набором указателей в наборе, исходя из базовой концепции: int — это имя набора, float — это имя набора, char — это имя. имя набора символов, double — это имя набора чисел высокой точности с плавающей запятой, color — имя типа данных в перечислении color = { blue, red, yellow).

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя адрес электронной почты и пароль

Опубликовать как гость

Электронная почта

Обязательно, но не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Тип данных Pointer — Руководство FreeBASIC Wiki


Автор: rdc

Тип данных pointer уникален среди числовых типов данных FreeBASIC. Вместо данных, как и другие числовые типы, указатель содержит адрес памяти данных.

В 32-разрядной системе тип данных указателя составляет 4 байта (8 байтов в 64-разрядной системе). FreeBASIC использует указатели для ряда функций, таких как ImageCreate, а указатели широко используются во внешних библиотеках, таких как Windows API. Указатели также довольно быстры, поскольку компилятор может напрямую обращаться к ячейке памяти, на которую указывает указатель. Правильное понимание указателей необходимо для эффективного программирования на FreeBASIC.

Многим начинающим программистам указатели кажутся странным и загадочным зверем. Однако, если вы будете помнить об одном правиле, у вас не должно возникнуть проблем с использованием указателей в вашей программе. Правило очень простое: указатель содержит адрес, а не данные. Если вы помните об этом простом правиле, у вас не должно возникнуть проблем с использованием указателей.

Указатели и память

Вы можете думать о памяти в вашем компьютере как о наборе почтовых ящиков (P. O. Box) в вашем местном почтовом отделении. Когда вы идете арендовать P.O. Box, служащий даст вам номер, например 100. Это адрес вашего P.O. Коробка. Вы решаете записать номер на листке бумаги и положить его в бумажник. На следующий день вы идете на почту и достаете бумажку. Вы находите ящик 100, заглядываете внутрь и находите кучу нежелательной почты. Конечно, вы хотите выбросить нежелательную почту, но под рукой нет корзины для мусора, поэтому вы решаете просто положить почту обратно в ящик и выбросить ее позже. Работа с указателями в FreeBASIC очень похожа на использование P.O. Коробка.

Когда вы объявляете указатель, он не указывает ни на что, что аналогично чистому листу бумаги. Чтобы использовать указатель, его необходимо инициализировать по адресу памяти, что равнозначно записи числа 100 на листке бумаги. Получив адрес, найдите нужный почтовый ящик. Box, вы можете разыменовать указатель, открыть почтовый ящик, чтобы добавить или получить данные из указанного места в памяти. Как видите, использование указателей состоит из трех основных шагов.

  1. Объявите переменную-указатель.
  2. Инициализировать указатель на адрес памяти.
  3. Разыменуйте указатель, чтобы манипулировать данными в указанной ячейке памяти.

На самом деле это ничем не отличается от использования стандартной переменной, и вы используете указатели почти так же, как и стандартные переменные. Единственная реальная разница между ними заключается в том, что в стандартной переменной вы можете напрямую обращаться к данным, а с помощью указателя вы должны разыменовать указатель для взаимодействия с данными.

Типизированные и нетипизированные указатели

FreeBASIC имеет два типа указателей: типизированные и нетипизированные. Типизированный указатель объявляется с соответствующим типом данных.

Dim myPointer As Integer Ptr

Это сообщает компилятору, что этот указатель будет использоваться для целочисленных данных. Использование типизированных указателей позволяет компилятору выполнять проверку типов, чтобы убедиться, что вы не используете неправильный тип данных с указателем, и упрощает арифметику указателя.

Нетипизированные указатели объявляются с использованием ключевого слова Any.

Dim myPointer As Any Ptr

Нетипизированные указатели не имеют проверки типа и по умолчанию имеют размер в байтах. Нетипизированные указатели используются в библиотеке времени выполнения C и во многих сторонних библиотеках, таких как Win32 API, для размещения указателя типа void в C. Если вам не нужен нетипизированный указатель, вы должны использовать типизированные указатели, чтобы компилятор мог проверить назначения указателя.

Операторы указателей

FreeBASIC имеет следующие операторы указателей.

Вы заметите, что оператор addressof возвращает не только адрес памяти переменной, но также может возвращать адрес подпрограммы или функции. Вы должны использовать адрес подпрограммы или функции для создания функции обратного вызова, например, используемой в функции CRT QSort.

Функции памяти

FreeBASIC также имеет ряд функций памяти, которые используются с указателями.

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

При использовании функции Allocate вы должны указать размер хранилища на основе типа данных, используя уравнение число_элементов * Размер (тип данных). Чтобы выделить место для 10 целых чисел, ваш код будет выглядеть так: myPointer = Allocate(10 * Sizeof(Integer)). Целое число составляет 4/8 байтов (в 32/64-битных системах), поэтому выделение 10 целых чисел выделит 40/80 байтов памяти (в 32/64-битных системах). Allocate не очищает сегмент памяти, поэтому любые данные в сегменте будут случайными, бессмысленными данными, пока он не будет инициализирован.

Callocate работает таким же образом, за исключением того, что вычисления выполняются внутри. Чтобы выделить те же 10 целых чисел с помощью Callocate, ваш код будет выглядеть так: myPointer = Callocate(10, Sizeof(Integer)). В отличие от Allocate, Callocate очистит сегмент памяти.

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

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

Не существует собственного метода определения размера распределения. Вы должны следить за этой информацией самостоятельно.
Будьте осторожны, чтобы не использовать одну и ту же переменную-указатель для выделения двух или более сегментов памяти. Повторное использование указателя без предварительного освобождения сегмента, на который он указывает, приведет к потере сегмента памяти, что приведет к утечке памяти.
Арифметика указателя и индексация указателя

Когда вы создаете сегмент памяти с помощью функций распределения, вам понадобится способ доступа к данным, содержащимся в сегменте. В FreeBASIC есть два метода доступа к данным в сегменте; используя оператор косвенности с арифметикой указателя и индексацией указателя.

Арифметика указателя, как следует из названия, складывает и вычитает значения указателя для доступа к отдельным элементам в сегменте памяти. Когда вы создаете типизированный указатель, такой как Dim myPointer as Integer ptr, компилятор знает, что данные, используемые с этим указателем, имеют размер Integer или 4 байта. Указатель при инициализации указывает на первый элемент сегмента. Вы можете выразить это как *(myPtr + 0). Чтобы получить доступ ко второму элементу, вам нужно добавить 1 к указателю, что может быть выражено как *(myPtr + 1).

Поскольку компилятор знает, что указатель является указателем на целое число, добавление 1 к ссылке указателя фактически увеличит адрес, содержащийся в myPtr, на 4/8 (в 32/64-битных системах), размер целого числа. Вот почему использование типизированных указателей предпочтительнее нетипизированных указателей. Компилятор делает за вас большую часть работы по доступу к данным в сегменте памяти.

Обратите внимание, что это конструкция *(myPtr + 1), а не *myPtr + 1. Оператор * имеет более высокий приоритет, чем +, поэтому *myPtr + 1 фактически увеличивает содержимое, на которое указывает myPtr, а не адрес указателя.

  • Сначала будет оцениваться myPtr, который возвращает содержимое ячейки памяти, а затем будет оцениваться +1, добавляя 1 к ячейке памяти. Заключая myPtr + 1 в круглые скобки, вы заставляете компилятор сначала оценивать myPtr + 1, что увеличивает адрес указателя, а затем применяется * для возврата содержимого нового адреса.

Индексация указателя работает так же, как арифметика указателя, но детали обрабатываются компилятором. *(myPtr + 1) эквивалентно myPtr[1]. Опять же, поскольку компилятор знает, что myPtr является указателем на целое число, он может вычислить правильные смещения памяти, чтобы вернуть правильные значения, используя индекс. Какой формат вы используете, зависит от вас, но метод индекса напоминает стандартный метод доступа к массиву и визуально его легче понять, чем оператор косвенности.

Функции указателя

Freebasic имеет набор функций указателя, дополняющих операторы указателя.

  • Cptr Преобразует выражение в указатель data_type. Выражение может быть другим указателем или целым числом.
  • Peek Возвращает содержимое области памяти, на которую указывает указатель. Data_type указывает тип ожидаемых данных.
  • Poke Помещает значение выражения в ячейку памяти, на которую указывает указатель. data_type указывает тип данных, помещаемых в ячейку памяти.
  • Sadd Возвращает место в памяти, где находятся строковые данные в динамической строке.
  • Strptr То же, что и Sadd.
  • Procptr Возвращает адрес функции. Это работает так же, как адрес оператора @.
  • Varptr Эта функция работает так же, как адрес оператора @.

Функции Sadd и Strptr работают со строковыми типами данных, возвращая адрес строковых данных. Функции Peek и Poke были добавлены для поддержки устаревшего кода. Procptr и Varptr работают так же, как адрес оператора @, но Proptr работает только с подпрограммами и функциями, а Varptr работает только с переменными. Cptr полезен для преобразования нетипизированного указателя в типизированный указатель, например возвращаемое значение из сторонней библиотеки.

Указатели подпрограмм и функций

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

Перед использованием указателя функции его необходимо инициализировать адресом подпрограммы или функции с помощью Procptr или @. После инициализации вы используете указатель таким же образом, как и при вызове исходной подпрограммы или функции. 9pwr
End Function

FuncPtr = @Power

Затем вы можете вызвать указатель на функцию так же, как если бы вы вызывали настоящую функцию.

FuncPtr(2, 4)

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

Например, предположим, что у вас есть объект собака и кошка. Оба объекта нуждаются в методе Speak. Определив Speak как указатель на функцию и связав Speak с подпрограммой Bark для собаки и подпрограммой Meow для кошки, вы можете сделать так, чтобы Speak выдавал «Гав!» или «Мяу!» в зависимости от типа объекта.

Создание функции обратного вызова

Одним из основных применений указателей на функции является создание функций обратного вызова. Функция обратного вызова — это функция, созданная вами в вашей программе, которая вызывается другой функцией или подпрограммой либо в вашем собственном кодовом пространстве, либо во внешней библиотеке. Windows использует функции обратного вызова для перечисления объектов Window, таких как шрифты, принтеры и формы.

Функция qsort, содержащаяся в библиотеке времени выполнения C, сортирует элементы массива, используя функцию обратного вызова для определения порядка сортировки. Прототип функции qsort содержится в crt/stdlib.bi:

Объявить подпрограмму qsort (ByVal As Any Ptr, ByVal As size_t, ByVal As size_t, ByVal As Function(ByVal As Any Ptr, ByVal As Any Ptr) As Long)

Ниже перечислены параметры подпрограммы qsort.

  1. Первый параметр — это адрес первого элемента массива. Самый простой способ передать эту информацию в qsort — добавить адрес оператора к индексу первого элемента: @myArray(0).
  2. Второй параметр — это количество элементов в массиве, то есть счетчик массива.
  3. Третий параметр — размер каждого элемента в байтах. Для массива целых чисел размер элемента будет 4 байта.
  4. Четвертый параметр является указателем на созданную пользователем функцию сравнения. Функция должна быть объявлена ​​с использованием модели передачи Cdecl, как показано в этом параметре.

Используя эту информацию, вы можете увидеть, как работает qsort. Передавая адрес первого элемента вместе с количеством элементов и размером каждого элемента, qsort может выполнять итерацию по массиву, используя арифметику указателей.

Qsort возьмет два элемента массива, передаст их пользовательской функции сравнения и использует возвращаемое функцией сравнения значение для сортировки элементов массива. Это повторяется до тех пор, пока каждый элемент массива не будет отсортирован.

Необходимо объявить прототип функции как Cdecl, что гарантирует передачу параметров в правильном порядке.

Объявить функцию QCompare CDecl (ByVal e1 As Any Ptr, ByVal e2 As Any Ptr) As Long

Затем вы должны определить функцию следующим образом.

‘Функция qsort ожидает три числа
‘от функции сравнения:
‘-1: если e1 меньше e2
‘0: если e1 равно e2
‘1: если e1 больше e2
Функция QCompare CDecl (ByVal e1 As Any Ptr, ByVal e2 As Any Ptr) As Long
    Dim As Integer el1, el2
    Static cnt As Integer

    ‘Получить количество вызовов и переданные элементы
    cnt += 1
  , must ‘Получить значения преобразование в целое число ptr
    el1 = *(CPtr(Integer Ptr, e1))
    el2 = *(CPtr(Integer Ptr, e2))
    Print «Вызвана Qsort»;cnt;» время(с) с»;el1;» и»;el2;». »
‘Сравните значения
, если EL1 return -1
elseif el1> el2, затем
Возврат 1
els функция.

#include «crt/stdlib.bi»

qsort @myArray(0), 10, SizeOf(Integer), @QCompare

Указатель на указатель

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

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

Dim myMemArray As Integer Ptr Ptr

Затем вы должны инициализировать ссылку указателя, используя Allocate или Callocate.

‘Создать 10 строк целочисленных указателей
myMemArray = CAllocate(10, SizeOf(Integer Ptr))

Обратите внимание, что переменная инициализирована значением Integer Ptr , так как этот список будет указывать на другой список; это указатель, который указывает на другой указатель. Затем вы можете инициализировать только что созданные ссылки на отдельные указатели, чтобы они указывали на необходимые сегменты памяти.

‘Добавить 10 столбцов целых чисел в каждую строку
For i As Integer = 0 To 9
    myMemArray[i] = CAllocate(10, SizeOf(Integer))
Next

В этом фрагменте кода отдельные указатели в списке инициализируются 10 сегментами памяти, которые будут содержать фактические целочисленные данные.

‘Добавить данные в сегмент памяти
For i As Integer = от 0 до 9
    For j As Integer = от 0 до 9
        myMemArray[i][j] = Int(Rnd * 10)
    Next
Next

Этот фрагмент кода использует метод index для загрузки фактических данных в сегменты памяти.

Оставить комментарий

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *