русс | укр

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

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

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

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


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

Указатели и адреса


Дата добавления: 2014-04-25; просмотров: 787; Нарушение авторских прав


 

Указатель – это переменная, содержащая адрес переменной. Указатели широко применяются в языке Си потому, что в некоторых случаях без них просто не обойтись, а также потому, что программы с ними обычно короче и эффективнее. При соблюдении определенной дисциплины с помощью указателей можно достичь ясности и простоты.

Унарный оператор & выдает адрес объекта, так что инструкция

 

p=&c;

присваивает адрес ячейки спеременной p. Говорят, что р указывает на с.

Унарный оператор * есть оператор раскрытия ссылки. Примененный к указателю он выдает объект, на который данный указатель ссылается. Предположим, что х и у - целые, а ip – указатель на int. Рассмотрим пример.

 

int x=1,y=2,z[10];

int *ip; // ip – указатель на int

ip=&x; // теперь ip указывает на х

y=*ip; // y теперь равен 1

*ip=0; // x теперь равен 0

ip=&z[0]; // ip теперь указывает на z[0]

 

Функции в языке Си в качестве своих аргументов получают значения параметров. Поэтому прямой возможности, находясь в вызванной функции, изменить переменную вызывающей функции нет. Например, в программе сортировки может понадобится функция swap, переставляющая местами два неупорядоченных элемента. Для их перестановки недостаточно написать swap(a,b);где функция swap определена следующим образом:

 

void swap(int x, int y) // НЕВЕРНО

{

int temp; temp=x;

x=y; y=temp;

}

Поскольку swap получает лишь копии значений переменных a и b, она не может повлиять на переменные a,b той программы, которая к ней обратилась. Чтобы получить желаемый эффект, надо вызывающей программе передать указатели на те значения, которые должны быть изменены: swap(&a,&b);Так как оператор & получает адрес переменной, &a – есть указатель на а. В самой функции swap параметры должны быть описаны как указатели, при этом доступ к значениям параметров будет осуществляться через них косвенно.



 

void swap( int *px, int *py)

{

int temp;

temp=*px;

*px=*py;

*py=temp;

}

Рассмотрим синтаксис декларирования переменных типа указатель, являющихся передаваемыми параметрами функции. Отметим, что в подобных случаях синтаксис подстраивается под синтаксис выражений, в которых такая переменная может встретиться. Например, запись:

double *dp, atof(char *);

означает, что выражение *dp и atof(s) имеют тип double, а аргумент функции atof есть указатель на char. Полезно знать, что указателю разрешено ссылаться только на объекты заданного типа. Существует одно исключение, указатель на void может ссылаться на объекты любого типа, но к такому указателю нельзя применять оператор раскрытия ссылки. Если ip ссылается на х целого типа, то *ip можно использовать в любом месте, где допустимо применение х. Например, оператор:

*ip = *ip + 10;

увеличивает *ip на 10. Унарные операторы * и & имеют более высокий приоритет, чем арифметические операторы. Указатели сами являются переменными. В тексте программы они могут встречаться и без оператора раскрытия ссылки. Например, если iq есть указатель на int, то можно использовать оператор:

ip = iq;

который копирует содержимое iq в ip, чтобы iq и ip ссылались на один и тот же объект.

Рассмотрим связь указателей и массивов. Декларация:

int a[10];

определяет массив а размера 10, то есть блок из 10 последовательных объектов с именами а[0],a[1],…a[9]. Запись a[i] отсылает к i –му элементу массива. Если pa есть указатель на int, то есть определен как:

int *pa;

то в результате присваивания

pa = &a[0];

pa будет указывать на нулевой элемент а, иначе говоря, будет содержать адрес элемента а[0]. Между индексированием и арифметикой с указателями существует очень тесная связь. По определению значение переменной или выражения типа массив есть адрес нулевого элемента массива. После присваивания:

ра = &a[0];

рa и a имеют одно и то же значение. Поскольку имя массива есть не что иное, как адрес его начального элемента, присваивание pa=&a[0]; можно также записать в следующем виде: pa=a; Интересно знать, что a[i] можно записать как *(a+i).

 

 



<== предыдущая лекция | следующая лекция ==>
Объединения, встраиваемые функции | Программирование параллельных вычислений. Введение


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


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

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

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


 


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

 
 

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

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