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

Конструктор копирования в C++ Программирование и разработка

Указатель является переменной, которая хранит адрес памяти в объекте. Затем указатель просто «указывает» на объект. Тип объекта должен соответствовать типу указателя. Указатели широко используются как в C, так и в C++ для трех основных целей:

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

Указатели используются для хранения и управления адресами динамически выделяемых блоков памяти. Такие блоки используются для хранения объектов данных или массивов объектов. Большинство структурированных и объектно-ориентированных языков предоставляют область памяти, называемую кучей или свободным хранилищем, из которой динамически выделяются объекты.

Тип данных указателя

Указатель — это тип данных, и самая чистая его форма в C — это void *. Пустой * может передавать адрес памяти, который делает указатель, но его нельзя разыменовать.

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

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

Чтобы упростить жизнь, C предоставляет ряд производных типов указателей, таких как char *, int *, double * и т. д. Указатели имеют свой собственный размер независимо от типа данных, на которые они указывают.

Пример:

  • char *x — указатель на char
  • int *x — указатель на целое число

Программа C для печати размера указателя

С

// C program to print the
// size of pointer
#include <stdio.h>
 
// Driver code
int main()
{
    int x = 10;
    int* ptr = &x;
 
    // Print size of variable
    printf("Size of variable: %zu",
            sizeof x);
 
    // Print size of pointer
    printf("\nSize of pointer: %zu",
            sizeof ptr);
 
    return 0;
}

Вывод

Size of variable: 4
Size of pointer: 8

Программа C++ для печати адреса указателя

С++

// C++ program to point address
// of a pointer
#include <iostream>
using namespace std;
 
// Driver code
int main()
{
    int *ptr, var;
    var = 5;
 
    // Assign address of var
    // to ptr
    ptr = &var;
 
    // Access value pointed by ptr
    cout << "Value pointed by ptr: " << 
            *ptr << endl;
 
    // Address stored by ptr
    cout << "Address stored at ptr: " << 
             ptr << endl;
 
    // Address of pointer ptr
    cout << "Address of ptr: " << 
             &ptr;
}

Вывод

Value pointed by ptr: 5
Address stored at ptr: 0x7ffe1c19b10c
Address of ptr: 0x7ffe1c19b110

Зачем нужно объявление типа данных указателя?

Тип данных указателя необходим в двух ситуациях:

  • Разыменование указателя.
  • Арифметика указателя.

Давайте обсудим каждый из них подробно.

Разыменование указателя

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

Ниже приведена программа C, демонстрирующая разыменование указателя int.

С

// C program to demonstrate
// dereferencing int pointer
#include <stdio.h>
int main()
{
    // Declare the integer variable
    int a = 20;
 
    // Declare the integer pointer
    // variable.
    int* ptr;
 
    // Store the address of 'x' variable
    // to the pointer variable 'ptr'
    ptr = &a;
 
    // value of 'x' variable is changed
    // to 8 by dereferencing a pointer 'ptr'
    *ptr = 8;
    printf("Value of x is : %d", a);
    return 0;
}

Арифметика указателя

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

Читайте также:  Свести список списка в Python

Пример:

char takes 1 byte
char  c = ‘a’;
char *ptr = &c;
ptr++;
Здесь ptr++ означает ptr = ptr + 1, поскольку char занимает 1 байт.
Это означает добавление 0×01 к адресу.

Точно так же для int это 4 байта, поэтому ptr++ в случае int будет добавлять 0×04 к адресу, хранящемуся в указателе.

Тип данных указателя — это переменная особого типа, предназначенная для хранения только адресов, а не значений (целое число, число с плавающей запятой, двойное число, символ и т. д.). Он знает, в скольких байтах хранятся данные. Когда мы увеличиваем указатель, мы увеличиваем указатель на размер типа данных, на который он указывает.
Рассмотрим следующий блок памяти:

Тип данных указателя — это переменная особого типа, предназначенная

Указатель занимает 8 байт памяти для хранения. В вышеуказанном блоке памяти-

  1. Если указатель ’ptr’ хранится в точке B (адрес между 1000000-10000099), тип указателя которого не объявлен (т. е. он будет сохранен в любом доступном месте) и изначально адрес указывает на переменную, которая находится между 2100 −2199, то доступ к переменной, на которую он указывает, займет много времени.
  2. Если указатель объявлен с типом данных, то он сохраняется в ближайшей доступной позиции для этого значения, например, сохраняется в точке A (адрес 2200-2299), которая является ближайшей к переменным типа «int», т.е. 4-байтовая строка, поэтому доступ также будет быть быстрее в сравнении.

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

Значение объявления типа данных указателя

  1. Без типа данных безопасность не может быть обеспечена.
  2. Объявление типа данных помогает увеличить скорость доступа к переменной, на которую указывает указатель.
  3. Компилятор должен знать размер ячейки памяти, на которую указывает указатель.
  4. Приведение указателя к типу является обязательным при доступе к структурам из указателя.
Оцените статью
bestprogrammer.ru
Добавить комментарий