Почему тип данных необходим в объявлении указателя? - PullRequest
24 голосов
/ 21 марта 2012

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

Но в случае указателей мы знаем, что их размер всегда составляет 2 байта (в Turbo Compiler) всегда независимо от типа данных переменной это указывает.

У меня такой вопрос: если указатели всегда принимают 2 байта , тогда зачем указывать тип данных при их объявлении? ИЛИ Мое понимание указателей неверно?

Ответы [ 8 ]

38 голосов
/ 21 марта 2012

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

9 голосов
/ 03 июля 2014

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

  1. Защита указателя
  2. Арифметика указателя

Как это используетсяв разыменование указателя ?
Рассмотрим следующий пример:

    {
        char *k; //poniter of type char
        short j=256;
        k=&j;    // Obviously You have to ignore the warnings
        printf("%d",*k)
    }

Теперь, поскольку k имеет тип char, поэтому он будет читать только один байт.Теперь двоичное значение 256 равно 0000000100000000, но поскольку k относится к типу char, поэтому он будет читать только первый байт, поэтому на выходе будет 0.
Примечание : если мы назначим j =127, то на выходе будет 127, потому что 127 будет удерживаться первым байтом.

Теперь перейдем к арифметике указателей :
Рассмотрим следующий пример:

    {
        short *ptr;
        short k=0;
        ptr=&k;
        k++;
        ptr++;// pointer arithmetic
    }

Являются ли операторы k++ и ptr++ одинаковыми?Нет, k++ означает k=k+1, а ptr++ означает ptr=ptr+2.Поскольку компилятор «знает», что это указатель и что он указывает на короткое замыкание, он добавляет 2 к ptr вместо 1, поэтому указатель «указывает» на следующее целое число.

Для получения дополнительной информации см. Вторую главу этого учебника.

6 голосов
/ 21 марта 2012

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

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

Например, попробуйте это:

int var[5];
char *c = (char *)var;
int  *x = var;

printf("%p\n%p\n", p + 1, x + 1);

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

5 голосов
/ 21 марта 2012

Проблема не в размере указателя, а в разыменовании указателя.(в C или C ++)

Допустим, у вас есть:

int* someint;
float* somefloat;

*someint указывает на объем памяти sizeof(int), тогда как *somefloat указывает на объем памяти sizeof(float)которые разные.

2 голосов
/ 11 февраля 2015

Типы данных нужны просто для проверки типов.

1 голос
/ 21 марта 2012

Предположим, что этот код компилируется без ошибок (как хотелось бы):

int a;
int b = 42;
void * d = &b;

a = *d;

Каким должно быть значение?

Теперь с этим:

int a;
float b = 42.0;
void * d = &b;

a = *d;

Что вы ожидаете в?

На самом деле тип определяет, как следует интерпретировать указанную область. Вы должны указать int * в первом примере и float * во втором вместо void *.

1 голос
/ 21 марта 2012

Какой размер нужен указателю, зависит от используемой вами системы.В системе x86_64 размер указателя может быть 64-разрядным.

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

Вы также можете использовать указатель void и делать все вручную.Но зачем тебе это?

0 голосов
/ 21 марта 2012

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

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