Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Доступ до змінної за вказівником
Припустімо, що ми не знаємо імені змінної, але знаємо її адресу. Чи можемо ми дістати доступ до цієї змінної? Існує спеціальний запис, призначений для доступу до значення змінної, використовуючи її адресу замість імені. В програмі 12.3 показано, як це можна зробити. #include<iostream.h> #include<conio.h> #include<stdio.h> #include<bios.h> int main() {clrscr(); int var1=11; int var2=22; cout<<"&var1="<<&var1<<endl; cout<<"&var2="<<&var2<<endl<<endl; int* ptr; ptr=&var1; cout<<*ptr<<endl; ptr=&var2; cout<<*ptr<<endl;
bioskey(0);
return 0; } Ця програма дуже схожа на попередню з тією різницею, що замість виведення на екран адреси, що зберігається в змінній, ми виводимо значення, яке за цією адресою зберігається. Вираз *ptr дозволяє нам одержати значення змінних var1 і var2. Зірочка, яка стоїть перед іменем змінної, називається операцією розіменування. Вказівники можна використовувати не тільки для одержання значення змінної, на яку він вказує, але і для виконання дій з цими змінними. Програма 12.4 використовує вказівник для присвоєння значення одній змінній, а потім іншій. #include<iostream.h> #include<conio.h> #include<stdio.h> #include<bios.h> int main() {clrscr(); int var1,var2; int* ptr; ptr=&var1; *ptr=37; var2=*ptr; cout<<var2<<endl; bioskey(0); return 0; } Програма 12.4 Зірочка, що використовується в операції розіменування – не те саме, що зірочка, яка використовується при оголошенні вказівника. Операція розіменування випереджає ім’я змінної і означає значення, що знаходиться в змінній, Натомість зірочка в оголошенні вказівника означає вказівник на. int* ptr; //оголошення, вказівник на *ptr=37; //розіменування Доступ до значення змінної, що зберігається за адресою, з використанням операції розіменування, називається непрямим доступом або розіменуванням вказівника.
Вказівник на void Відмітимо одну особливість вказівників. Адреса, яка поміщається у вказівник, повинна бути одного з ним типу. Ми не можемо присвоїти вказівнику на int адресі змінної типу float. Однак є один виняток: існує тип вказівника, який може вказувати на будь-який тип даних. Він називається вказівником на void і визначається так: void* ptr; //вказівник на довільний тип даних Такі вказівники призначені для використання в певних випадках, наприклад, при передачі вказівників у функції, що працюють незалежно від типу даних, на які вказує вказівник.
Розглянемо приклад використання вказівника на void. В цій програмі також показано, що, якщо ми не використовуємо вказівника на void, нам слід бути обережними, присвоюючи вказівнику адресу того ж типу, що й вказівник. Далі приведений лістінг програми 12.5 #include<iostream.h> #include<conio.h> #include<stdio.h> #include<bios.h> int main() {clrscr(); int intvar; float flovar; int* ptrint; float* ptrflo; void* ptrvoid; ptrint=&intvar;//так можна – однакові типи // ptrint=&flovar; //так не можна – різні типи ptrint=(int*)&flovar; // ptrflo=&intvar; //так не можна – різні типи ptrflo=(float*)&intvar; //так можна – примусове перетворення типів ptrflo=&flovar; ptrvoid=&intvar; //так можна - void ptrvoid=&flovar; //так можна - void
bioskey(0); return 0; } Програма 12.5
В цій програмі ми використали примусове перетворення типів «вказівник»
ptrflo=(float*)&intvar; //так можна – примусове перетворення типів
Вказівники і масиви Вказівники і масиви дуже тісно пов’язані між собою. Фактично, ім’я масиву є вказівником на його перший член. Тому «переміщуватися вздовж» масиву можна з використанням вказівників, як показано в програмі 12.6. #include<iostream.h> #include<conio.h> #include<stdio.h> #include<bios.h> int main() {clrscr(); int intarray[5]={31,54,77,52,93}; for(int j=0;j<5;j++) cout<<*(intarray+j)<<endl; bioskey(0); return 0; } Програма 12.6
|
|||||
Последнее изменение этой страницы: 2021-12-15; просмотров: 56; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.227.0.192 (0.006 с.) |