Студопедия

КАТЕГОРИИ:


Архитектура-(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)

Вказівники-константи і вказівники-змінні

Вказівники і масиви

Вказівник на void

Відмітимо одну особливість роботи з вказівниками. Адреса, яка поміщається у вказівник, повинна бути одного з ним типу. Ми не можемо присовїти вказівнику на int адресу змінної типу float.

float flovar=99.6;

int* ptrint=&flovar; //заборонений вираз

Але є виняток – існує тип вказівника, який може вказувати на довільний тип даних. Він називається вказівником на void і визначається наступним чином:

void* ptr;

Такі вказівники призначені для використання в певних випадках, наприклад, при передачі вказівників у функції, які працюють незалежно від типу даних, на які вказує вказівник.

Розглянемо приклад використання вказівника на void.

 

#include<iostream>

using namespace std;

 

int main()

{int intvar;

float flovar;

 

int* ptrint;

float* ptrflo;

void* ptrvoid;

 

ptrint=&intvar; //так можна int*=int*

//ptrint=&flovar; //заборонено – вказівники різного типу

//ptrflo=&intvar; //заборонено – вказівники різного типу

ptrflo=&flovar; //float*=float*

 

ptrvoid=&intvar; **так можна void*=int*

ptrvoid=&flovar; //так можна void*=float*

return 0;

}

 

Якщо нам з певних причин необхідно прсвоїти одному типу вказівника інший тип, то з цією метою можна використати функцію reinterpret_cast:

 

ptrint=reinterpret_cast<int*>(&flovar);

ptrflo= reinterpret_cast<float*>(&intvar);

 

 

Вказівники і масиви дуже схожі. Зокрема, доступ до елементів масиву можна одержати як за допомогою індексів, так і за допомогою вказівників.

 

#include<iostream>

using namespace std;

 

int main()

{int intarray[5]={31, 54, 77, 52, 93};

 

for(int j=0; j<5; j++)

cout<<*(intarray+j)<<endl;

return 0;

}

 

Результат дії виразу *(intarray+j) – такий сам, як і виразу intarry[j], при цьому результат роботи однаковий. Ім’я масиву є його адресою, запис типу (intarray+3) означає адресу четвертого елементу масиву (оскільки нумерація починається з нуля), а запис *(intarray+3) – значення, записане за цією адресою

 

Припустимо, що ми хочемо використати операцію збільшення замість додавання кроку j до імені intarray. Чи можна записати *(intarray++)?

Зробити так не можна, оскільки не можна змінювати константи. Вираз intarray є адресою в пам’яті, де наш масив буде зберігатися до завершення роботи програми, тому intarray – це вказівник константи. Написати intarray++ неможливо, так само, як неможливим є запис 7++.

Ми не можемо збільшувати адресу, але можемо збільшувати вказівник, який містить цю адресу. Далі приведена програма, яка показує, як це робиться.

 

#include<iostream>

using namespace std;

 

int main()

{int intarray[5]={31, 54, 77, 52, 93};

int* ptrint;

ptrint=intarry;

for(int j=0; j<5; j++)

cout<<*(ptrint++)<<endl;

return 0;

}

 

Тут ми визначили вказівник на int - ptrint – і присвоїли йому значення адреси масиву intarray. Тепер ми можемо дістати доступ до елементів масиву, використовуючи вираз:

*(ptrint++)

 

<== предыдущая лекция | следующая лекция ==>
Доступ до змінної по вказівнику | Операція delete
Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 678; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.008 сек.