Указатели и операции над адресами 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Указатели и операции над адресами



 

Обращение к объектам любого типа как операндам операций в языке C может проводиться:

- по имени;

- по указателю (косвенная адресация).

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

Указатель объявляется следующим образом:

<базовый тип> *<имя>;

Здесь базовый тип – это тип переменной, адрес которой будет содержать указатель. Имени указателя должна предшествовать звездочка «*».

Например: int *a, *d; /* указатели a, d можно инициализировать */

/* адресами целочисленных переменных */

float *f; /* указатель f можно инициализировать */

/* адресами вещественных переменных */.

С указателями связаны две унарные операции: & и *. Операция & означает «взять адрес» операнда (т.е. установить указатель на операнд). Операция * имеет смысл: «значение, расположенное по указанному адресу» и работает следующим образом:

- определяется местоположение в оперативной памяти переменной типа указатель;

- извлекается информация из этого участка памяти и трактуется как адрес переменной с типом, указанным в объявлении указателя;

- производится обращение к участку памяти по выделенному адресу для проведения некоторых действий.

Пример 1:

int x, /* переменная типа int */

*y; /* указатель на элемент данных типа int */

y=&x; /* y есть адрес переменной x */

*y=1; /* косвенная адресация указателем поля x ИЛИ */

/* “по указанному адресу записать 1”, т.е. x=1 */

Пример 2:

int i, j=8, k=5, *y; /* в одном объявлении можно смешивать простые переменные */

/* и переменные-указатели */

y=&i;

*y=2; /* i=2 */

y=&j; /* переустановили указатель на переменную j */

*y+=i; /* j+=i, т.е. j=j+1 -> j=j+2=10 */

y=&k; /* переустановили указатель на переменную k */

k+=*y; /* k+=k, k=k+k = 10 */

(*y)++; /* k++, k=k+1 = 10+1 = 11 */

Говорят, что использование указателя означает отказ от именования (разыменование) адресуемого им объекта.

 

Связь указателей и массивов

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

Например:

float p[100]; /* объявлен массив p из 100 элементов с плавающей точкой */

float *q; /* объявлен указатель на тип данных с плавающей точкой */

int i; /* объявлена переменная целого типа */

Если выполнить операцию q=&p[0] (или q=a); то следующие обращения к i-ому элементу массива эквивалентны: p[i], *(q+i), *(p+i).

Итак, имя массива без указания квадратных скобок есть адрес нулевого элемента массива, поэтому с помощью указателей можно использовать две эквивалентные формы выражений для доступа к элементам массива: q[i] и *(q+i). Первая форма привычнее и удобна для чтения, вторая – эффективнее по быстродействию.

Очевидно, что следующие выражения также эквивалентны:

&q[0] то же что и &(*q) то же что и q. /* адрес */

*q то же что и q[0] /* значение по адресу */

Если переменная q указывает на очередной элемент массива p, то (q+1) указывает на следующий элемент, при этом выполняется соответствующее масштабирование для приращения адреса с учетом длины объекта

Пример работы с указателями

Листинг 8. Упорядочить по алфавиту массив строк (не более 20) длиной не более 10 символов в каждой

/*______________________________*/

#include <conio.h>

#include <stdio.h>

#include <string.h>

void main()

{ char s[20][10],r[10]; int i,j,n;

clrscr();

puts(“enter number of strings”); scanf(“%d”,&n);

for (i=0;i<n;i++) scanf(“%s”,*(s+i));

for (i=0;i<(n-1);i++)

for (j=(i+1);j<n;j++)

if (strcmp(*(s+i),*(s+j))>0)

{ strcpy(r,*(s+i)); strcpy(*(s+i),*(s+j)); strcpy(*(s+j),r); }

for (i=0;i<n;i++)

printf(“\n%s”,*(s+i));

getch();

}

Задача3. Варианты



Поделиться:


Последнее изменение этой страницы: 2016-12-17; просмотров: 158; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.217.208.72 (0.004 с.)