русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Указатели


Дата добавления: 2013-12-23; просмотров: 1263; Нарушение авторских прав


Все переменные и другие объекты хранятся в оперативной памяти. Оперативную память можно представить в виде некоторой последовательности байтов, куда можно записывать данные и код. Когда работает программа, то ей доступна не вся оперативная память, а выделяется некоторый сегмент или область в оперативной памяти. Байты внутри сегмента пронумерованы. Если для некоторой переменной, например типа int, выделяется 4 байта, то можно к этой переменной обращаться, зная номер первого байта внутри сегмента, с которого размещается эта переменная. Этот номер байта внутри сегмента интерпретируется как адрес объекта или переменной, для хранения адресов существуют специальные переменные – указатели.

Указатель – это переменная, которая хранит адрес участка памяти, выделенного для объектов определенных типов.

Указатель не является самостоятельным типом, он всегда связан с каким-либо другим конкретным типом, на который он указывает. (Существует правда указатель на тип void, который не связан с конкретным типом).

Формат определения указателя соответствует формату определения переменных стандартных типов (указатель тоже переменная, размещенная в оперативной памяти), но перед именем переменной указателя ставится знак «*».

Примечания. Размерность переменной указателя на любой тип объекта в Win32 составляет 32 бита. Размер сегмента в оперативной памяти может достигать размера 232 = 4294967296 Байт = 4 ГБ, но далеко не все диапазоны адресов в сегменте доступны прикладной программе. Следует также знать, что выделением конкретных адресов в сегменте для прикладной программы занимается операционная система, поэтому при запуске одной и той же программы даже на одном компьютере конкретные значения адресов могут отличаться.

Так как указатель это переменная, размещенная в оперативной памяти, то она имеет адрес и существует указатель на указатель, например, int ** pp; (По аналогии существует указатель на указатель на указатель и т.д.)



Примеры:

int x=5; // Обычная переменная типа int

int *pX=&x, // Переменная указатель с инициализацией – хранит адрес переменной x

*p1, // Указатель на тип int определенный без инициализации

*p2; // Указатель на тип int определенный без инициализации

float * pF; // Указатель на тип float определенный без инициализации

При работе с указателями используются две основные унарные операции:

«&» - операция получения адреса объекта, применяется к объекту (переменной), результат операции – значение адреса объекта;

«*» - операция обращения по адресу (разыменования указателя), применяется к указателю, результат – значение объекта (переменной), на который указывает указатель, без особых ограничений типа модификатора const результат является леводопустимым выражением, т.е. может использоваться слева от операции присваивания.

Пример:

int x=5; // Обычная переменная типа int

int *p; // Переменная указатель на тип int

p=&x; // Указатель теперь содержит адрес переменной x

printf(“x=%d”, *p); // Будет напечатано значение переменной x

*p=100; // Значение переменной x будет изменено

printf(“x=%d”, x); // Будет напечатано x=100

 

При объявлении указателя ему может быть присвоено начальное значение (инициализация указателя). В качестве инициализатора может быть:

– явно заданный адрес участка памяти (требуется явное преобразование к типу указателя);

– указатель, уже имеющий значение;

– выражение, позволяющее получить адрес объекта с помощью операции &;

– выражение для динамического выделения памяти с помощью специальных функций – malloc, calloc, realloc (в Си++ появился специальный оператор для выделения памяти – new).

int x=5; // Обычная переменная типа int

int *p1=&x; // Инициализация указателя с помощью операции &

int *p2=p1; // Инициализация указателя с помощью другого указателя

char * p3=(char *)0xB800; // Присвоение указателю явного значения

int *p4=NULL; // Указатель, имеющий 0 значение

int *p5=malloc(100*sizeof(int)); // Выделение памяти для массива из 100 элементов

 

Некоторые операции с указателями:

1. К указателям одного типа можно применять операции сравнения: == != >= <= > <

2. Типизированный указатель (указатель не на тип void) можно складывать (вычитать) с целым значением или применять операции инкремент (декремент). Результат подобных операций – значение адреса, увеличенное (уменьшенное) на заданное число байт, при этом за «условную единицу» принимается число байт, которое занимает объект, на который указывает указатель.

Пример:

#include <stdio.h>

void main()

{

int a=100;

int *p=&a;

printf("p=%p", p);

p++; // Значение адреса увеличится на 4, так как переменная int занимает 4 байта

printf("\np=%p", p);

}

На консоли будет напечатано (значения могут быть и другими):

p=0021FA3C

p=0021FA40

 



<== предыдущая лекция | следующая лекция ==>
Термины | Инициализация массива


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.004 сек.