Как отмечалось во втором уроке, каждая переменная хранится в памяти. Естественно у каждой переменной в памяти есть свой адрес, по которому она записана. Мы уже даже использовали адреса переменных, когда пользовались функцией scanf().
Чтобы получить адрес переменной нам необходимо перед её именем написать символ “&”.
Память компьютера мы можем представить себе в виде таблицы с ячейками по одному байту, каждая из которых имеет свой адрес. Кстати, адреса записываются цифрами шестнадцатеричной системы. Например, это можно представить так, как показано на следующем рисунке.
Рис.3 Пример представления памяти компьютера
Как мы уже знаем, каждая переменная в зависимости от её типа, она занимает в памяти различное количество байт. Ну или в нашей интерпретации ячеек. Для того, чтобы узнать размеры различных типов переменных можно использовать функцию sizeof(). Ниже представлена программа, иллюстрирующая её использование.
Листинг 16.1
#include <stdio.h>
int main (){
printf ("razmer peremennoi tipa char %d\n", sizeof(char));
printf ("razmer peremennoi tipa int %d\n", sizeof(int));
printf ("razmer peremennoi tipa float %d\n", sizeof(float));
printf ("razmer peremennoi tipa double %d\n", sizeof(double));
return(0);
}
Результат её работы:
Рис 4. Программа иллюстрирующая работу sizeof()
У вас данные цифры могут быть другими кстати. Так как стандартом языка не оговаривается какой тип сколько должен занимать в памяти. Оговариваются только из соотношения. Например, размер double не должен быть меньше чем размер float.
То есть, если я объявляю в программе переменную типа int, то под нее в памяти выделяется 4 байта (ячейки).
Так как мы уже умеем получать адрес переменной, то давайте посмотрим на него. Для того, чтобы вывести число в шестнадцатеричной системе существует специальный спецификатор “%x”. И для него есть модификатор “#” при его записи, шестнадцатеричное число выводится с символами «0х».
Листинг 16.2
#include <stdio.h>
int main (){
int a,b;
printf ("adres peremennoi a %#x\n", &a);
printf ("adres peremennoi b %#x\n", &b);
return(0);}
Рис.5 Адреса переменных в памяти
Мы получили два адреса 0x12ff60 и 0x12ff56. По этим адресам в памяти записаны наши переменные a и b. При этом они занимают в памяти по 4 клетки подряд, так как это переменные целого типа и из рисунка 3 видно, что их размер 4 байта. Это выглядит примерно следующим образом.
Рис.6. Пример расположения переменных в памяти
Как вы уже заметили, переменные в память записываются не одна за другой, а в произвольном месте, лишь бы там было пусто и хватило места. Исключение составляют массивы. Они записываются в память последовательно. Посмотрите на результат работы следующей программы.
Листинг 16.3
#include <stdio.h>
int main (){
int a[3];
printf ("adres peremennoi a[0] %#x\n", &a[0]);
printf ("adres peremennoi a[1] %#x\n", &a[1]);
return(0);
}
Рис.7 Расположение массива в памяти
Видите, каждый элемент занимает ровно 4 ячейки, потом идет следующий. По порядку и никак иначе. Это важный факт, он иногда используется в программировании. Но сейчас не об этом.
Адреса это хорошо, но что с ними делать? На кой чёрт они нам сдались?