КАТЕГОРИИ: Архитектура-(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++)
Дата добавления: 2014-01-07; Просмотров: 678; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |