| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Указатель на массив |
| Автор: Alexey91 8.8.2010, 18:19 | ||
| Здравствуйте! Не могу понять как использовать указатель на массив (да и вообще в каких случаях это нужно) Если смотреть по коду, то если x=a, программа будет виснуть почему не понимаю Ведь а - это адрес начала массива И я указателю на массив присваиваю адрес начала другого массива, но если написать амперсанд, то будет работать.
|
| Автор: cmygeHm 9.8.2010, 08:27 | ||
я вообще не видел никогда такой конструкции:
А где Вы ее вычитали? |
| Автор: Annihilator 9.8.2010, 08:37 |
| Здесь будет различие в типах int (*x)[10]; x - указатель на массив из 10 элементов типа int int a[10]; a - указатель на первый элемент int-массива т.е. в первом случае рассматривается адрес именно всего массива, т.е. в случае с переменной a адрес всего массива запишется как &a (именно то, что у тебя в коде) ну а для компиляции выражения x=a надо чтобы a являлся 2-мерным массивом со второй размерностью, равной 10 в данном случае, т.е. a[X][10] Как-то так. |
| Автор: Alexey91 9.8.2010, 14:53 |
| Annihilator Думал, думал и никак не понял фразу "адрес всего массива". Как я понимаю массив представляет собой на носителе несколько ячеек памяти одного типа, адрес начала массива первая ячейка памяти. А вот адрес всего массива.. где он находится, к чему он конкретно относится? Не понятно( А по поводу A[x][10] я понял так, что если присвоить x=A, то у x будет адрес элемента A[0][адрес всего массива] но что такое адрес всего массива я никак понять не могу(( |
| Автор: baldina 9.8.2010, 17:13 | ||||||
т.е. имя массива в контексте похоже на указатель, потому что неявно приводится к типу указателя. но не является указателем. зачем нужно: 1. перебрать все элементы в коллекции
2. Передать адрес начала массива в функцию:
|
| Автор: Alexey91 9.8.2010, 17:49 | ||
| Annihilator Угу! Мне как раз компилятор и выдал: 16 cannot convert `int[10]' to `int (*)[10]' in assignment А я никак понять не мог. Только не понимаю почему нужно перед а ставить апмерсанд, ведь при а и &а будет выводится один и тот же адрес. Где происходит различие, что одно является адреса начала, а другое адресом всего массива) т.е. амперсандом мы как бы получаем &int[10] Я понял все, что ты сказал по аналогии с обычными переменными: int d,*e; d=1; e=&d; также с массивами int (*a)[10], b[10]; b[10]={0,1,2,3,4,5,6,7,8,9}; a=&b;
Хм.. а почему я получаю значение элемента а[0] только после двойного разыменования? Если не трудно, можешь написать.. если мы берем х, то получаем если мы берем *x ... **х Baldina, спасибо ! |
| Автор: boostcoder 9.8.2010, 17:56 |
| не занимайтесь велоизобретательством, используйте контейнеры. |
| Автор: Annihilator 9.8.2010, 18:43 | ||||||
Адрес один, да типы разные.
Если ты опреляешь переменную как массив int a[10] - здесь a еще не указатель иначе говоря a является указателем, при использовании без скобок [], допустим как аргумент функции (в соответствии с п.4.2.1 Стандарта) На лицо одномерный масив, и с помощью такого указателя мы можем двигаться поэлементно если же мы объявляем int (*x)[10]; то в этом объявлении x - уже указатель, а если его использовать без [] - получается что x становится указателем на указатель и мы можем двигать не поэлементно а "помассивно", т.е. можем использовать для построчного считывания 2d-массива
Объяснил как мог... |
| Автор: toxx 9.8.2010, 20:24 | ||
если пользоваться сразу контейнерами, не будешь знать множество ньюансов их создания.имхо |
| Автор: boostcoder 9.8.2010, 21:57 | ||||
ок. перефразирую: не занимайтесь велоизобретательством в реальных программах. |
| Автор: baldina 10.8.2010, 11:00 | ||||
Alexey91, при объявлении
про это в книжках пишут, почитай... http://www.realcoding.net/articles/chast-v-ukazateli-i-massivy.html, например, пункт 5.3 |
| Автор: Alexey91 12.8.2010, 10:40 | ||||||
| Извиняюсь, за свое отсутствие Annihilator, чувствую что понял (хотя чувства обманчивы )... Переменная x является указателем на указатель, и при добавлении к переменной a амперсанда мы получаем адрес, который является указателем на адрес начала массива. И при увеличении адреса х, мы переместимся не на элемент массива, а на весь массив. Кстати, чтобы не путаться адрес и указатель означают же одно и то же? Есть переменная-указатель, которая хранит адрес это же аналогично Есть переменная-указатель, которая хранит указатель? И.. если у нас массивы любые, двумерные, n-мерные располагаются последовательно в памяти (т.е. например вызов элемента массива a[3][4] означает то же самое, что и a[0][12]). То зачем тогда были введены все эти размерности??? Baldina
Я имел ввиду в контексте программы), так мне ясно, что является указателем, а что указателем на указателем. У меня тогда возникла путаница, что a (адрес начала массива) и &a имеют одинаковый адрес |