![]() Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву ![]() Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Указатели и операции над адресамиСодержание книги
Поиск на нашем сайте
Обращение к объектам любого типа как операндам операций в языке 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; просмотров: 194; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.21.12.39 (0.009 с.) |