Указывает ли результат базовый адрес var или целых 4 байта (в моей платформе)?если он указывает только базовый адрес, то почему * ptr вычисляет все содержимое var?разве он не должен отображать содержимое только базового адреса var?
Как вы уже упоминали, используемая вами платформа имеет 4
размер байта int
.
var
- это переменная типа int
:
100 101 102 103
var -------------------------
| | | | |
-------------------------
byte1 byte2 byte3 byte4
where, 100 - 104 are the address of byte1-byte4 respectively.
ptr
- это указатель на int
и указывает на var
.
когда вы делаете int *ptr = &var;
, это означает что-то вроде этого:
ptr 100 101 102 103
-------- var -------------------------
| &var |-------->| | | | |
-------- -------------------------
byte1 byte2 byte3 byte4
Тип ptr
равен int *
, то есть указатель на целое число.Итак, тип *ptr
равен int
.Это означает, что когда вы разыменовываете ptr
, это дает значение по адресу, на который указывает ptr
, а его тип указывает тип значения, которое int
в вашем случае.Вот почему *ptr
оценивается как целое int
, а не только базовый адрес.
Обратите внимание, что если вы сделаете это
char *c_ptr = (char *)&var;
, это изменит интерпретацию адреса var
при доступе с использованием c_ptr
и *c_ptr
будет интерпретироваться как char
.Тем не менее, адреса, по которым ptr
и c_ptr
указывают на одно и то же число.
Проверьте это:
#include <stdio.h>
int main() {
int var = 50;
int *i_ptr = &var;
char *c_ptr = (char *)&var;
printf ("address of var: %p\n", (void *)&var);
printf ("i_ptr: %p\n", (void *)i_ptr);
printf ("i_char: %p\n\n", (void *)c_ptr);
printf ("value of var: %d\n", var);
printf ("value of *i_ptr: %d\n", *i_ptr);
for (size_t i = 0; i < sizeof(int); i++) {
printf ("Address of byte[%zu]: %p, ", i, (void *)&c_ptr[i]);
printf ("byte[%zu]: %c\n", i, c_ptr[i]);
}
return 0;
}
Вывод на архитектуре с прямым порядком байтов:
address of var: 0x7ffeea3ac9f8
i_ptr: 0x7ffeea3ac9f8 <========\
i_char: 0x7ffeea3ac9f8 <========/ the address pointing to is same
value of var: 50
value of *i_ptr: 50
Address of byte[0]: 0x7ffeea3ac9f8, byte[0]: 2 <========= 50th character of ascii
Address of byte[1]: 0x7ffeea3ac9f9, byte[1]:
Address of byte[2]: 0x7ffeea3ac9fa, byte[2]:
Address of byte[3]: 0x7ffeea3ac9fb, byte[3]:
Вывод на архитектуре с прямым порядком байтов:
address of var: ffbffbd0
i_ptr: ffbffbd0
i_char: ffbffbd0
value of var: 50
value of *i_ptr: 50
Address of byte[0]: ffbffbd0, byte[0]:
Address of byte[1]: ffbffbd1, byte[1]:
Address of byte[2]: ffbffbd2, byte[2]:
Address of byte[3]: ffbffbd3, byte[3]: 2