Доступ до змінної за вказівником 


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



ЗНАЕТЕ ЛИ ВЫ?

Доступ до змінної за вказівником



Припустімо, що ми не знаємо імені змінної, але знаємо її адресу. Чи можемо ми дістати доступ до цієї змінної?

Існує спеціальний запис, призначений для доступу до значення змінної, використовуючи її адресу замість імені. В програмі 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; просмотров: 55; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

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