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

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

Вопрос задан

Изменён 4 года 4 месяца назад

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

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

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

14

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

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

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

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

UPD1:

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

2

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

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

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

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

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

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

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

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

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

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

Почта

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

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

Почта

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

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

НОУ ИНТУИТ | Лекция | Производные типы.

Тип указатель: указатели на объекты

< Лекция 4 || Лекция 5: 123 || Лекция 6 >

Аннотация: В лекции рассматриваются определение и виды указателей, способы объявления, инициализация указателей на объекты, методы доступа к данным через указатели, размещение указателей и адресуемых ими объектов в памяти, операции над указателями.

Ключевые слова: производный тип, указатель, базовый тип, преобразование типов, синтаксис, компилятор, тип переменной, значение, адрес, переменная, объект, тип объекта, структурный тип, идентификатор, доступ, описатели, унарные операции, косвенная адресация, операнд, адресация, адрес переменной, синтаксис объявления, операция приведения, спецификатор, операции, разыменование, инкремент, декремент, место, определение, производный тип данных, приведение типов, входные данные, диапазон

Цель лекции: изучить классификацию производных типов, тип указатель и соотношения между именами, адресами и значениями переменных, научиться использовать указатели в программных кодах на языке C++.

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

Непосредственно производные типы. Эти типы являются производными от некоторых существующих типов, реализуя типы указателей, ссылки, функции преобразования типов. В группу непосредственно производных типов входят:

  • массивы;
  • указатели;
  • ссылки;
  • перечисления.

Составные производные типы. В группу составных производных типов входят типы, являющиеся производными от различных существующих или ранее объявленных типов:

  • intuit.ru/2010/edi»>классы;
  • структуры;
  • объединения.

Переименование типов

В некоторых программных кодах бывает удобно вводить новые обозначения имен отдельных используемых типов данных. Задавать новое имя типу можно с помощью ключевого слова typedef.

Синтаксис:

typedef Тип НовоеИмяТипа[Размерность];

Например:

typedef unsigned int UNIT;
typedef char Msg[100];

Такое имя можно затем использовать так же, как и стандартное имя типа:

UNIT a,b,c;//переменные типа unsigned int
Msg str[10];//массив из 10 строк по 100 символов

Рассмотрим тип указатель. Указатели являются специальными объектами в программах на С++. Они предназначены для хранения адресов памяти.

Рассмотрим пример ( рис. 4.1). Когда компилятор обрабатывает оператор определения переменной, например, int a=10;, то в памяти выделяется участок памяти в соответствии с типом переменной и записывается в этот участок указанное значение (размер типа int не менее 2 байтов и зависит от реализации). Все обращения к переменной a компилятор заменит на адрес области памяти, в которой хранится эта переменная. Операция &a является операцией взятия адреса ее операнда.

Рис. 4.1. Адресация в С++

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

Указатель – именованный объект, предназначенный для хранения адреса области памяти (объекта, непоименованной области оперативной памяти либо точки входа в функцию).

Указатель не является самостоятельным типом, он всегда связан с каким-то другим типом. Указатели делятся на две категории:

  • указатели на объекты;
  • указатели на функции.

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

Указатели на объекты

В общем случае синтаксис определения указателя на объект:

Тип*Описатель;

При определении указателя специфицируется имя указателя-переменной (в дальнейшем указатель) и тип объекта, на который он ссылается.

Тип задает тип объекта, адрес которого будет содержать определяемая переменная и может соответствовать базовому, пустому (свободному, родовому, то есть типу void ), перечислению, структурному типу и типу объединения.

Реально указатель на void ни на что не указывает, но обладает способностью указывать на область любого размера после его типизирования каким-либо объектом.

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

Знак ‘*’ является унарной операцией косвенной адресации, его операнд – указатель, а результат – адрес объекта, на который указывает операнд. Адресация является косвенной, так как обращение к области памяти осуществляется не напрямую по адресу (например, 1А2В), а через объект, которому в памяти соответствует определенный участок. Объем памяти, который выделяется для хранения данных, определяется типом данных и моделью памяти. Для приведенной на рисунке 2 модели памяти адресом переменной типа float с именем summa является 0012FF48, адресом переменной типа int с именем date является 0012FF54, адресом переменной типа char с именем ch является 0012FF63.

Рис. 4.2. Адресация типов в С++

Примеры определения указателей:

int *P;
  /*указатель Р может содержать адрес объекта типа int*/
float *s;
  /*указатель s может содержать адрес объекта типа float*/

Синтаксис объявления указателя на объект базового типа:

Тип*ИмяУказателя;

где ИмяУказателя – идентификатор.

Например,

char *s; //переменная s – указатель на объект типа char
double *x; /*переменная х – указатель на объект типа 
             double, вещественного числа с плавающей 
             точкой удвоенной точности*/
int *k, *ff; //k, ff – указатели на объекты целого типа
int *p, y; /*р – указатель на объект типа int, 
y – целочисленная переменная и не является
    указателем*/
int x, *p; /*х – целочисленная переменная и не является
                 указателем,
р – указатель на объект типа int*/

intuit.ru/2010/edi»>Указатель может быть константой или переменной, а также указывать на константу или переменную.

Например:

int i;//целая переменная 
const int ci=1; //целая константа
int *pi; //указатель на целую переменную
const int *pci; //указатель на целую константу
int *const cpi; //указатель-константа на целую переменную
const int *const cpc;
                //указатель-константа на целую константу

При объявлении указателя его можно сразу проинициализировать (задать значение):

int *pi=&i; //указатель на целую переменную
const int *pci=&ci; //указатель на целую константу
int *const cpi=&i; 
            //указатель-константа на целую переменную
const int *const cpc=&ci; 
           //указатель-константа на целую константу

Если модификатор const относится к указателю (т.е. находится между именем указателя и *), то он запрещает изменение значения указателя, а если он находится слева от типа (т. е. слева от *), то он запрещает изменение значения, на которое указывает указатель.

Дальше >>

< Лекция 4 || Лекция 5: 123 || Лекция 6 >

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

спросил

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

Просмотрено 42к раз

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

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

2

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

8

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

В C указатель может обращаться к переменным любых типов данных. Указатель должен быть объявлен с типом данных переменной, на которую будет указывать указатель. Для печати адреса указателя в шестнадцатеричном формате используйте %p , а для печати адреса в других формах используйте %u . Если указатель будет использоваться для отображения значения указывающей переменной, используйте *имя_указателя и только для адреса используйте 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

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

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

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

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

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

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

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

c — Зачем нужны приведения типа указателя?

спросил

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

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

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

То есть, если я встречу следующий фрагмент кода:

int a = 5; , затем оба

char*b = (char*)&a; и int*c = (int*)&a

указывают на одно и то же место в памяти.

Действительно, при выполнении char*b = (char*)&a часть содержимого памяти может быть потеряна, но это связано с типом b is char* который может хранить только sizeof(char ) байта памяти, и это можно было сделать неявно.

  • c
  • стрелки
  • gcc
  • типы
  • литье

3

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

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

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

Выдержка

 char *b = (int*)&a;
 

неверно, потому что int * не может быть присвоено char * . Вы имели в виду char *b = (char *)&a; . Стандарт C говорит, что вам нужно явное приведение типов, потому что типы несовместимы. Это «да, да, я знаю, что делаю».

Выдержка

 int*c = (int*)&a;
 

правильно, но &a уже является указателем на int , поэтому приведение не будет выполнять преобразование, поэтому вы можете записать его как int *c = &a; .

6

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

Нет, не , а только для арифметики указателей. Его и важны для доступа к данным, на которые указывает указатель, неправильный способ доступа, как в вашем примере, приводит к неправильным результатам.

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

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

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