![]() |
|
Модераторы: bsa |
![]()
|
|
| Alexey91 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 195 Регистрация: 18.9.2008 Репутация: нет Всего: нет |
Здравствуйте!
Не могу понять как использовать указатель на массив (да и вообще в каких случаях это нужно) Если смотреть по коду, то если x=a, программа будет виснуть почему не понимаю Ведь а - это адрес начала массива И я указателю на массив присваиваю адрес начала другого массива, но если написать амперсанд, то будет работать.
|
|||
|
||||
| cmygeHm |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 96 Регистрация: 3.12.2008 Репутация: нет Всего: -2 |
я вообще не видел никогда такой конструкции:
А где Вы ее вычитали? |
|||
|
||||
| Annihilator |
|
|||
![]() bytegrinder ![]() ![]() Профиль Группа: Участник Сообщений: 493 Регистрация: 21.11.2006 Где: Омск Репутация: 1 Всего: 3 |
Здесь будет различие в типах
int (*x)[10]; x - указатель на массив из 10 элементов типа int int a[10]; a - указатель на первый элемент int-массива т.е. в первом случае рассматривается адрес именно всего массива, т.е. в случае с переменной a адрес всего массива запишется как &a (именно то, что у тебя в коде) ну а для компиляции выражения x=a надо чтобы a являлся 2-мерным массивом со второй размерностью, равной 10 в данном случае, т.е. a[X][10] Как-то так. -------------------- Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо |
|||
|
||||
| Alexey91 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 195 Регистрация: 18.9.2008 Репутация: нет Всего: нет |
Annihilator Думал, думал и никак не понял фразу "адрес всего массива". Как я понимаю массив представляет собой на носителе несколько ячеек памяти одного типа, адрес начала массива первая ячейка памяти. А вот адрес всего массива.. где он находится, к чему он конкретно относится? Не понятно(
А по поводу A[x][10] я понял так, что если присвоить x=A, то у x будет адрес элемента A[0][адрес всего массива] но что такое адрес всего массива я никак понять не могу(( |
|||
|
||||
| Annihilator |
|
|||
![]() bytegrinder ![]() ![]() Профиль Группа: Участник Сообщений: 493 Регистрация: 21.11.2006 Где: Омск Репутация: 1 Всего: 3 |
Я имел в виду что при таком объявлении: int (*x)[10] x - "указатель на массив из десяти int", т.е. имеет тип int (*)[10] а если так: int x[10], то x имеет тип "int[10]" т.е. если в первом случае инкрементировать x, то мы не попадем на следующий элемент массива, значение x увеличится на 10*sizeof(int), а не на sizeof(int) т.е. x - имеет тип "указатель на массив из 10 целых чисел" Типы разные, в этом все дело Кстати, вот Это сообщение отредактировал(а) Annihilator - 9.8.2010, 16:29 -------------------- Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо |
|||
|
||||
| baldina |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
т.е. имя массива в контексте похоже на указатель, потому что неявно приводится к типу указателя. но не является указателем. зачем нужно: 1. перебрать все элементы в коллекции
2. Передать адрес начала массива в функцию:
|
||||||
|
|||||||
| Alexey91 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 195 Регистрация: 18.9.2008 Репутация: нет Всего: нет |
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, спасибо ! Это сообщение отредактировал(а) Alexey91 - 9.8.2010, 18:15 |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
не занимайтесь велоизобретательством, используйте контейнеры.
|
|||
|
||||
| Annihilator |
|
||||||
![]() bytegrinder ![]() ![]() Профиль Группа: Участник Сообщений: 493 Регистрация: 21.11.2006 Где: Омск Репутация: 1 Всего: 3 |
Адрес один, да типы разные.
Если ты опреляешь переменную как массив int a[10] - здесь a еще не указатель иначе говоря a является указателем, при использовании без скобок [], допустим как аргумент функции (в соответствии с п.4.2.1 Стандарта) На лицо одномерный масив, и с помощью такого указателя мы можем двигаться поэлементно если же мы объявляем int (*x)[10]; то в этом объявлении x - уже указатель, а если его использовать без [] - получается что x становится указателем на указатель и мы можем двигать не поэлементно а "помассивно", т.е. можем использовать для построчного считывания 2d-массива
Объяснил как мог... Это сообщение отредактировал(а) Annihilator - 9.8.2010, 18:54 -------------------- Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо |
||||||
|
|||||||
| toxx |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 653 Регистрация: 4.3.2009 Где: НН Репутация: 4 Всего: 13 |
если пользоваться сразу контейнерами, не будешь знать множество ньюансов их создания.имхо |
|||
|
||||
| boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
ок. перефразирую: не занимайтесь велоизобретательством в реальных программах. |
||||
|
|||||
| baldina |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
Alexey91, при объявлении
про это в книжках пишут, почитай... тут, например, пункт 5.3 |
||||
|
|||||
| Alexey91 |
|
||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 195 Регистрация: 18.9.2008 Репутация: нет Всего: нет |
Извиняюсь, за свое отсутствие
Annihilator, чувствую что понял (хотя чувства обманчивы )... Переменная x является указателем на указатель, и при добавлении к переменной a амперсанда мы получаем адрес, который является указателем на адрес начала массива. И при увеличении адреса х, мы переместимся не на элемент массива, а на весь массив. Кстати, чтобы не путаться адрес и указатель означают же одно и то же? Есть переменная-указатель, которая хранит адрес это же аналогично Есть переменная-указатель, которая хранит указатель? И.. если у нас массивы любые, двумерные, n-мерные располагаются последовательно в памяти (т.е. например вызов элемента массива a[3][4] означает то же самое, что и a[0][12]). То зачем тогда были введены все эти размерности??? Baldina
Я имел ввиду в контексте программы), так мне ясно, что является указателем, а что указателем на указателем. У меня тогда возникла путаница, что a (адрес начала массива) и &a имеют одинаковый адрес |
||||||
|
|||||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |