Я считаю, что понимаю, как обычные переменные и указатели представлены в памяти, если вы используете C.
Например, легко понять, что указатель Ptr будет иметь адрес, а его значение будет отличаться от адреса, который является пространством в памяти, на которое он указывает. Следующий код:
int main(){
int x = 10;
int *Ptr;
Ptr = &x;
return 0;
}
Имеет следующее представление в памяти:
+---------------------+-------------+---------+
| Variable Name | Address | Value |
+---------------------+-------------+---------+
| x | 3342 | 10 |
+---------------------+-------------+---------+
| Ptr | 5466 | 3342 |
+---------------------+-------------+---------+
Однако мне трудно понять, как массивы представлены в памяти. Например, код:
int main(){
int x[5];
x[0]=12;
x[1]=13;
x[2]=14;
printf("%p\n",(void*)x);
printf("%p\n",(void*)&x);
return 0;
}
выводит один и тот же адрес дважды (для простоты 10568). Это означает, что x == & x. Тем не менее * x (или x [0] в записи массива) равно 12, * (x + 1) (или x [1] в записи массива) равно 13 и т.д. Как это можно представить? Один из способов может быть следующим:
+---------------------+-------------+----------+----------------------+
| Variable Name | Address | Value | Value IF array |
+---------------------+-------------+----------+----------------------+
| x | 10568 | 10568 | 12 |
+---------------------+-------------+----------+----------------------+
| | 10572 | | 13 |
+---------------------+-------------+----------+----------------------+
| | 10576 | | 14 |
+---------------------+-------------+----------+----------------------+
| | 10580 | | trash |
+---------------------+-------------+----------+----------------------+
| | 10584 | | trash |
+---------------------+-------------+----------+----------------------+
Это близко к тому, что происходит или полностью отключено?