Невозможно выяснить зависимость между адресом определенных переменных, как это было показано компилятору C, и фактическим базовым оборудованием.
Рассмотрим пример 1 после компиляции этого кода с помощью cc t2.c
,и его выполнение, похоже, не работает должным образом, адреса px
и py
не переставляются по какой-либо причине.
Пример 1:
#include <stdio.h>
void swap(int *,int *);
int main(){
int x=3;
int y=2;
int *px;
int *py;
px=&x;
py=&y;
printf("px = %x\npy = %x\n",&px,&py);
swap(px,py);
printf("After the swap\npx = %x\npy = %x\n",&px,&py);
}
void swap(int *px,int *py){
int temp;
temp=*px;
*px=*py;
*py=temp;
}
GDB из примера 1:
6 int x=3;
(gdb) n
7 int y=2;
(gdb) n
10 px=&x;
(gdb) p x
$1 = 3
(gdb) p &x
$2 = (int *) 0x7efff5cc
(gdb) p px
$3 = (int *) 0x0
(gdb) p &px
$4 = (int **) 0x7efff5d4
(gdb) n
11 py=&y;
(gdb) p px
$5 = (int *) 0x7efff5cc
(gdb) p &px
$6 = (int **) 0x7efff5d4
....
pi@readonly:~/new$ cc t2.c
pi@readonly:~/new$ a.out
px = 7ea765fc
py = 7ea765f8
After the swap
px = 7ea765fc
py = 7ea765f8
Пример 2:
int x = 1, y = 2 ;int *ip; /* ip is a pointer to an int */
ip = &x; /* ip now points to x */
y = *ip; /* y is now 1 */
*ip = 10; /* x is now 10 */
*ip = *ip + 1; /* x is now 11 */
*ip += 1; /* x is now 12 */
++*ip; /* x is now 13 */
(*ip)++; /* x is now 14, parentheses are required */
Пример 1 Q:
1) Правильно ли я понимаю, что, начиная с $5
, px
- это точно такая же переменная, как x
, за исключением того, что ее значение установлено в 0x7efff5cc
в шестнадцатеричном формате, который является просто адресом переменнойx
в памяти ??
2) Если мы используем объявление int *ip
, значит ли это, что переменная ip
имеет значение, равное адресу int
?Тогда каков адрес int
в шестнадцатеричном формате?
3) Что означает адрес переменной, что это за 0x7efff5cc
?Другими словами:
Я знаю, что есть RAM, L2, L3, L1 кэши CPU, ROM.Итак, адрес какой конкретной памяти представляет это число?
Сколько таких 0x7efff5cc
может вместить этот конкретный тип памяти?Или, где я могу проверить это в системе Linux?
4) Что означает запись (int **)
?
5) Что не так с программой, как исправитьэто для того, чтобы адреса px
и py
были заменены после передачи в качестве значений аргумента функции swap
?
Пример 2 Q:
5) Относительнонотации, я правильно понимаю, что как только мы объявим, что переменная ip
является указателем на int
, через int *ip
, мы не можем присвоить, например, десятичное значение для ip
, позжеon, используя присваивание, подобное: ip = 10;
, поскольку после того, как переменная была объявлена как указатель, она используется исключительно для хранения адресов других переменных, на которые ip
"указывает", в шестнадцатеричном формате?