1

Тема: Вказівник на вказівник

Із звичайними вказівниками проблем ніби-то немає. Коли дійшла справа до вище згаданої теми, я спробував і...
Чим відрізняться наступні 2 вирази:

    int* a[50];

та

    int** b = new int* [50];

За діями, ніби одне і те ж. Виділяється пам'ять під 50 вказівників. Але з адресами щось не те.
Припустимо, що адреса a - 0x00001; адреса області виділеної оператором new - 0x00003.
Я розумію, що а - вказівник на перший елемент массиву, тобто вказівник на вказівник.
b - "штучно" створений вказівник. Тут я і починаю плутатися. Якою адресою він ініціалізується? Як його використати, щоб звернутися до елемента массиву. Чим взагалі відрізняються ці вирази?

Я припускаю, що останній вираз є, можливо, більш семантично коректним.
Поясніть, будь-ласка, найбільш детально, де, що і як.

2 Востаннє редагувалося Cyan (24.06.2013 19:27:21)

Re: Вказівник на вказівник

це чудово застосовувати для двохмірного масиву
в себе в методичці я знайшла такий приклад:

...
   int** a; //a - вказівник на масив вказівників
   a = new int*[n]; //виділення пам’яті для масиву вказівників на n рядків
   for(int i = 0; i < n; i++)
      a[i] = new int[m]; //виділення пам’яті для кожного рядка масиву розмірністю m
...
// Вивід елементів масиву
   for(int i = 0; i < n; i++){
      for(int j = 0; j < m; j++){
         cout << a[i][j] << "   ";
      }
      cout<<endl;
   }

ну і для пам'яті:

   for(int i = 0; i < n; i++)
      delete[] a[i]; //звільнення пам’яті від кожного рядка
   delete[] a; //звільнення пам’яті від масиву вказівників
Психологічні бесіди з додатковою послугою промивання мізків. Недорого.
Не дизайню. Взагалі ні разу. У назві розділу "Дизайн та графіка" є слово "графіка" - ось тут трохи шарю. І не більше. Так, часто питають.
Продам гараж
Подякували: incred, Regen, leofun013

3 Востаннє редагувалося koala (24.06.2013 19:35:56)

Re: Вказівник на вказівник

Обидва вирази однаково коректні і (майже) однаково працюють. Різниця в тому, що a - масив з вказівників в стеку, а b вказує на масив вказівників в купі.

incred написав:

b - "штучно" створений вказівник. Якою адресою він ініціалізується?

Є окрема зона пам'яті - "купа" (heap). new бере вільну ділянку в купі, позначає її зайнятою і повертає її адресу. delete позначає її вільною.

incred написав:

Як його використати, щоб звернутися до елемента массиву.

Точнісінько так, як і a. Не забуваємо - в C/C++ вираз x[y] є синонімом до *(x+y) (з певними обмеженнями на типи x та y), а ім'я массиву в більшості виразів розглядається як адреса нульового елемента: a=&a[0].

incred написав:

Чим взагалі відрізняються ці вирази?

Тим, що значення змінної a (адреси нульового елемента) фіксоване, а значення b можна змінювати. Ну і не слід забувати вивільнити виділену пам'ять (або навпаки - a припинить існування з функцією, а ділянка пам'яті, виділена під b, житиме, тому повертати a з функції не можна, а b можна). А, так, sizeof у них різний. Що ж до роботи безпосередньо з масивом - все однаково.

І ще - раджу на практиці користуватися stl. array та vector самі відстежують пам'ять.

Подякували: incred, Regen, leofun013

4

Re: Вказівник на вказівник

Cyan написала:

це чудово застосовувати для двохмірного масиву

Це чудово для двовимірного масиву із РІЗНОЮ довжиною рядків (пилковидного), наприклад, для трикутної матриці. А якщо всі рядки однакові, то краще, щоб не плутатися, змінити адресацію

int *a=new int[5*6];
a[6*i+j]=...

Так дуже легко передавати цей масив параметром в функції, а то з багатовимірними це буває нетривіально.

Подякували: incred, Cyan, Regen, leofun014

5

Re: Вказівник на вказівник

Дуже дяукю. Я думаю, ця тема буде корисною для новачків(таких як я).

6

Re: Вказівник на вказівник

Будь-ласка, ще одне питання.
Як правильно називаються такі "багатомірні" вказівники?

7

Re: Вказівник на вказівник

дуже просто: подвійний вказівник

Психологічні бесіди з додатковою послугою промивання мізків. Недорого.
Не дизайню. Взагалі ні разу. У назві розділу "Дизайн та графіка" є слово "графіка" - ось тут трохи шарю. І не більше. Так, часто питають.
Продам гараж
Подякували: incred1

8

Re: Вказівник на вказівник

Cyan написала:

дуже просто: подвійний вказівник

2=4, отже?)

int ****a = 0; // езотерику ніхто не відміняв

I belong to the Dead Generation.

9 Востаннє редагувалося Cyan (24.06.2013 22:31:08)

Re: Вказівник на вказівник

Bartash
в даному контесті він питав по подвійні, відповідно, й про назву теж по них
логічно здогадатись, і про int ****a

Прихований текст
http://img1.joyreactor.cc/pics/post/%D0%9A%D0%BE%D0%BC%D0%B8%D0%BA%D1%81%D1%8B-%D1%88%D0%B0%D1%83%D1%80%D0%BC%D0%B0-%D1%84%D0%B0%D1%81%D1%82%D1%84%D1%83%D0%B4-%D0%BF%D0%B5%D1%81%D0%BE%D1%87%D0%BD%D0%B8%D1%86%D0%B0-485791.jpeg
Психологічні бесіди з додатковою послугою промивання мізків. Недорого.
Не дизайню. Взагалі ні разу. У назві розділу "Дизайн та графіка" є слово "графіка" - ось тут трохи шарю. І не більше. Так, часто питають.
Продам гараж
Подякували: Bartash, leofun012

10

Re: Вказівник на вказівник

Можна ще по-простому: вказівник на вказівник :)

11

Re: Вказівник на вказівник

Replace написав:

Можна ще по-простому: вказівник на вказівник :)

Риба. Тему вважаю вичерпаною. :)

I belong to the Dead Generation.