Приклад. З наведених прикладів можна зробити висновок, що надати значення деякій статичній змінній можна двома способами:
void main()
{
int a;
a = 5;
int *b; //a: 5 &a: 9004:0FFE b : 000B:8FCF
b = &a; //a: 5 &a: 9004:0FFE b: 9004:0FFE
*b = 10; //a: 10 &a: 9004:0FFE b: 9004:0FFE
}
З наведених прикладів можна зробити висновок, що надати значення деякій статичній змінній можна двома способами:
- використовуючи її ім’я ( а = 5)
через вказівник, значенням якого
Вказівнику дозволено вказувати тільки на об'єкти певного типу. (Існує одне виключення: "вказівник на void" може вказувати на об'єкти будь-якого типа, але до такого вказівника не можна застосовувати оператор непрямого доступу.
Якщо ip вказує на x цілого типу, то *ip можна використовувати в будь-якому місці, де допустимо вживання x;
наприклад*ip = *ip + 10; збільшує *ip на 10.
Унарні оператори * і & мають більш високий пріоритет, ніж арифметичні оператори, так що присвоєння у = *ip + 1; бере те, на що вказує ip, і додає до нього 1, а результат присвоює змінній у.
Аналогічно *ip += 1; збільшує на одиницю те, на що вказує ip; ті ж дії виконують ++*ip; і (*iр)++;
В останньому записі дужки необхідні, оскільки якщо їх не буде, збільшиться значення самого вказівника, а не того, на що він вказує. Це обумовлено тим, що унарні оператори * і ++ мають однаковий пріоритет і порядок виконання - справа наліво.
Оскільки вказівники самі є змінними, в тексті вони можуть зустрічатися і без оператора непрямого доступу.
- є адреса цієї змінної (b = &a; *b = 10)
Переадресація вказівників
Відразу після створення вказівника b (int *b), він отримує значення випадкової адреси (b = 000B:8FCF). Варто пам’ятати, що комірка пам’яті з адресою 000B:8FCF – випадкова, тобто в цій комірці може зберігатися значення деякої іншої змінної (неможливо сказати якої, бо адреса її вибиралася випадково). Тому, якщо відразу після створення вказівника b (int *b) виконати оператор *b = 10, то таким чином можна змінити значення деякої змінної (визначити якої неможливо). Тому після створення вказівника необхідно:
- або переадресувати її на потрібну статичну змінну (як у наведених прикладах b = &a – переадресація вказівника b на статичну змінну а);
- або створити так звану динамічну змінну, адрес якої буде міститися у вказівнику)
2. Динамічна пам’ять
Динамічні змінні, як і статичні можуть містити значення відповідного типу. Над ними можна виконувати такі ж операції, як і над статичними змінними того ж типу.
Різниця між динамічними змінними та статичними:
1. Динамічна змінна не має імені, а статична має.
2. Тому:
- до статичної змінної можна звертатися як через її ім’я, так і через деякий вказівник, адресований на цю змінну;
- до динамічної змінної можна звертатися лише через деякий вказівник, адресований на неї.
3. Динамічні змінні знаходяться в так званій динамічній пам’яті (в «купі» або в heap). А статична – в статичній.
4. Статична змінна створюється один раз (при описі) і існує до кінці роботи програми, займаючи часто дорогоцінну пам’ять. Динамічну змінну можна створювати і видаляти (звільняти пам’ять) в довільній точці програми.
Щоб створити динамічну змінну (зарезервувати під нею пам’ять в купі) необхідно примінити команду new до деякого вказівника. Щоб знищити динамічну змінну (вивільнити пам’ять) необхідно примінити команду delete до вказівника, що направлений на цю змінну. Сам вказівник після цього необхідно занулити (присвоїти значення 0 (NULL))
Дата добавления: 2015-08-26; просмотров: 830;