КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Указатели
Указатель – это переменная, значением которой является адрес, по которому располагаются данные. Адрес – это номер ячейки памяти, в которой или с которой располагаются данные. Классифицировать указатели можно: • по типу данных (типизированные и не типизированные указатели); • по области доступа (ближние и дальние указатели). Типизированный указатель – указатель, содержащий адрес данных определенного типа (системного или пользовательского). Не типизированный указатель – указатель, содержащий адрес данных неопределенного типа (просто адрес). Ближний указатель – указатель, содержащий только смещение, по которому располагаются данные. Сегмент в этом случае используется по умолчанию – текущий сегмент данных. Размер ближнего указателя в 16-разрядном реальном режиме работы процессора составляет 16 бит, а в 32-разрядном защищенном режиме – 32 бита. Дальний указатель – указатель, содержащий и сегмент и смещение. Размер дальнего указателя в 16-разрядном реальном режиме работы процессора составляет 32 бита (16 бит – сегмент, 16 бит - смещение), а в 32-разрядном защищенном режиме – 48 бит (16 бит – селектор, 32 бита - смещение). Работа с указателями в языке С включает три действия, осуществляемых в следующем порядке:
Объявление (описание) указателя в языке C имеет следующий вид: тип [near|far] *имя [=значение]; В современной реализации языка C (стандарт C99), ориентированной под разработку программ для ОС Windows, вследствие используемой в ОС Windows модели памяти, используются исключительно ближние (near) указатели, поэтому при объявлении указателя (например, в среде разработки Pelles C) модификатор области доступа указывать не надо.
Указатель при объявлении можно инициализировать, указав через знак присвоения соответствующее значение. Данное значение должно быть адресом, записанном в одном из следующих виде: • нулевое значение (идентификатор NULL); • другой указатель; • адрес переменной (через операцию взятия адреса); • выражение, представляющее собой арифметику указателей; • адрес, являющийся результатом выделения динамической памяти. Операция взятия адреса – операция языка C, возвращающая адрес переменной. Данная операция имеет следующий синтаксис: &имя_переменной Например, в программе описаны следующие переменные: int a,b; double c; Описание указателей на эти переменные с инициализацией будет иметь вид: int *ptr_a = &a, *ptr_b = &b; double *ptr_c1 = &c, *ptr_c2 = ptr_c1; Пример объявления не типизированного указателя с инициализацией нулевым значением: void *ptr = NULL; Установка указателя - присвоение его значению адреса, по которому располагаются или будут располагаться данные. Для установки указателя используется оператор присвоения, в левой части которого указывается имя указателя, а в правой – одно из значений отличных от NULL, используемых при инициализации указателя. Пример установки указателей: int a = 10, *ptr = NULL; ptr = &a; Для обращения к значению, располагаемому по адресу, содержащемуся в указателе, используется операция разыменования указателя. Данная операция имеет следующий синтаксис: *имя_указателя Значение, полученное путем разыменования указателя, может рассматриваться в программе как LValue, так и RValue значение. Например: double x = 0.0, *ptr = NULL; ptr = &x; scanf("%lf”,ptr); *ptr += 1.5; printf("%lf\n”,*ptr); В языке С можно создавать константные указатели – значение, расположенное по этому указателю нельзя изменить. Создание такого указателя имеет следующий синтаксис: const тип *имя = инициализирующее значение; Например, следующий фрагмент программы приведет к ошибке компиляции: int a = 10; const int *ptr = &a; (*ptr)++; Объявление указателя на массив имеет тот же синтаксис, что и объявление обычного указателя. Например, объявление указателя на вещественный массив типа double будет иметь вид: double *arrptr = NULL; Объявление целочисленного массива из десяти элементов с инициализацией нулевыми значениями, и объявление с инициализацией указателя на этот массив будут иметь вид: int arr[10] = {0}, *arrptr = arr; Фрагмент программы, в которой объявляется массив из 10 элементов целого типа, осуществляется ввод массива с вычислением суммы его элементов и вывод значения этой суммы с использованием указателей на массив и на переменную для хранения суммы: int array[10] = {0}, summa = 0; int *arrptr = array, *ptr = &summa; for(int i=0;i<10;i++){ scanf("%d”,&arrptr[i]); *ptr += arrptr[i]; } printf("Сумма: %d\n”,*ptr); Довольно часто встречаются случаи, когда необходимо работать с массивами указателей. Синтаксис объявления массива указателей следующий: тип *имя[размер]; Например: вычисление суммы набора целых чисел через обращение к ним посредством массива указателей на целые числа: int arr[10], *ptrs[10], summa = 0; for(int i=0;i<10;i++) ptrs[i] = &arr[i]; for(int i=0;i<10;i++){ scanf("%d”,ptrs[i]); summa+= *ptrs[i]; } printf("Сумма: %d\n”,summa);
Дата добавления: 2014-01-06; Просмотров: 406; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |