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

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

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

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

Ответы

Ответ 1

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

Ответ 2

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

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

Например, попробуйте следующее:

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

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

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

Ответ 3

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

Скажите, что у вас есть:

int* someint;
float* somefloat;

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

Ответ 4

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

  • Отключение указателя
  • Арифметика указателя

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

    {
        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, поэтому указатель "указывает на" следующее целое число.

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

Ответ 5

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

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

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

Ответ 6

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

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

a = *d;

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

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

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

a = *d;

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

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

Ответ 7

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

Ответ 8

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