Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь 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; просмотров: 184; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.15.228.171 (0.007 с.) |