Почему тип данных необходим в объявлении указателя?
Насколько я знаю о Тип данных, объявляя переменную, нам нужно объявить ее тип данных, который сообщает компилятору зарезервировать количество байтов в памяти соответственно.
Но в случае указателей мы знаем, что их размер всегда имеет 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
это понятие сильной типизации, используемой в С++. размер указателя может быть одинаковым, но размер заостренного типа может отличаться. вы можете всегда указывать указатель одного типа на указатель другого типа.