Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.76/50: Рейтинг темы: голосов - 50, средняя оценка - 4.76
0 / 0 / 0
Регистрация: 15.11.2011
Сообщений: 25

Как использовать указатели при работе с массивами?

28.11.2011, 16:03. Показов 11310. Ответов 111
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
подскажите пожалуйста как правильно использовать указатели при работе с массивами. Как написать этк программу используя указатели?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 #include<iostream>
 using namespace std;
 const int n = 10;
 int main()
 {
 int X[n] = {1,2,3,4,5,6,7,8,9,10};
 int Y[n]= {2,3,4,6,7,3,4,5,1,9,};
 int Z[n]= {1,2,3,4,5,6,7,8,9,0};
 int U[n];
 for (int i = 0; i < n; i++)
 {
 U[i]=X[i]+Y[i]-Z[i];
 cout<<U[i]<<" ";
 }
 cout << endl;
 system("pause");
 }
если я правильно понял *X - это тоже самое, что и X[0] , а как написать при помощи указателей к примеру X[4]и т.п.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.11.2011, 16:03
Ответы с готовыми решениями:

Указатели при работе с одномерными и двумерными массивами
Помогите Даны натуральное число n, целые числа а1,...,аn . Выяснить, имеется ли среди чисел а1,...,аn совпадающие.

Ошибка при работе с массивами
Здравствуйте. Хочу сделать программу, которая сортирует цифры. Вот код: #include &lt;iostream&gt; using namespace std; int...

Ошибка при работе с массивами char
Задание: написать функцию для сложения целых двоичных чисел. Слагаемые должны иметь тип unsigned char. Вот что получилось, но после...

111
0 / 0 / 0
Регистрация: 15.11.2011
Сообщений: 25
28.11.2011, 16:56  [ТС]
Студворк — интернет-сервис помощи студентам
однако у меня в окне ошибок тупо все неумещалось и надо было только ползунок поднять в окно просто не усещались все сообщения и я видел только prforumlb1.exe - 1 error(s), 1 warning(s) нажимал на них а они не показывали строку
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
28.11.2011, 16:59
Ты ещё и не в том окне смотришь...
0
 Аватар для Гоблин
1 / 1 / 1
Регистрация: 17.10.2010
Сообщений: 29
29.11.2011, 13:40
Да, я что-то перепутал. На самом деле delete удаляет только память под сам указатель, а delete[] удаляет еще и то, на что ссылкается указатель. Пардоньте за ломаные объяснения.
C++
1
2
3
int *A = new int; // простой указатель
...
delete A; // правильное удаление, т.к. нужно удалить только А
C++
1
2
3
int *A = new int [10]; // массив
... // в том числе заполнение массива
delete []A;
Во втором случае правильно delete[] т.к. сначала очистится память под элементы массива, а потом только сам указатель на массив. Если тут использовать delete A то будет удален только указатель на массив, элементы же останутся в памяти. К слову, в современных компиляторах существуют так называемые "сборщики мусора", которые должны сгладить такую ошибку программиста и удалить элементы, однако как это работает я точно не знаю.

2Bers: Спасибо, что указали на ошибку, но было бы быстрее и проще сразу просто объяснить механизм работы оператора.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
29.11.2011, 13:55
Цитата Сообщение от fasked Посмотреть сообщение
x[i] - это тоже самое, что *(x + i). Сначала указатель смещается на i позиций, а потом разыменовывается. Соответственно x[0] = *(x + 0) = *(x) = *x.
Так делается только при использовании X[i]. Вычислять же таким образом явный указатель смысла нет. Уж если хочешь юзить явно смещаемый указатель с массивом, то в цикле, инкрементя на каждом шагу сам указатель. А если не в цикле инкрементами/декремнетами, а сложение с индексом, то прячь адресную арифметику под оператор [].
1
Заблокирован
29.11.2011, 14:29
Цитата Сообщение от Гоблин Посмотреть сообщение
2Bers: Спасибо, что указали на ошибку, но было бы быстрее и проще сразу просто объяснить механизм работы оператора.
Толку было бы мало.

А так, ты прочувствовал всю глубину этого деликатного момента, и теперь любому сможешь объяснить, как и почему нужно удалять.
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
29.11.2011, 14:32
Цитата Сообщение от taras atavin Посмотреть сообщение
Вычислять же таким образом явный указатель
Что значит явный указатель?
0
 Аватар для alkagolik
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548
29.11.2011, 14:57
Цитата Сообщение от fasked Посмотреть сообщение
Что значит явный указатель?
видимо имелось ввиду: фактический адрес памяти, которая хранит адрес памяти с данными. т.е. не так *( array + i ), а так ++array. Наверное чтобы это делать надо "набить руку" на указателях, чтобы осознавать что это и как работает. Чтобы легче было понять что такое указатели и зачем они нужны надо проштудировать способы\методы адресации данных в эвм. Среди них есть косвенная адресация, которая реализована в языке Си посредством указателей, так же есть индексная - тоже имеющая к ним непосредственное отношение. Ссылка ее недостаточно для изучения.
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
29.11.2011, 15:00
Цитата Сообщение от alkagolik Посмотреть сообщение
++array
Я вроде и не говорил, что и когда лучше или хуже. Я говорил во что в итоге раскрывается адресация с помощью индекса.
0
 Аватар для alkagolik
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548
29.11.2011, 15:06
fasked, не знаю, я предположил
0
 Аватар для Гоблин
1 / 1 / 1
Регистрация: 17.10.2010
Сообщений: 29
30.11.2011, 00:08
Bers, Возможно. В любом случае спасибо за то, что указали на ошибку.

Что значит явный указатель?
Я где-то с этим сталкивался, но не помню совершенно что это значит. Нашел на википедии:
Языки программирования, в которых предусмотрен тип указателей, содержат, как правило, две основные операции над ними: присваивание и разыменование. Первая из этих операций присваивает указателю некоторый адрес. Вторая служит для обращения к значению в памяти, на которое указывает указатель. Разыменование может быть явным и неявным, в большинстве современных языков программирования разыменование происходит только при явном указании.
Либо поиском пользоваться разучился, либо действительно нет ничего вменяемого по теме. Может кто ни будь сможет объяснить что такое явный и неявный указатель?
0
Заблокирован
30.11.2011, 00:17
Цитата Сообщение от Гоблин Посмотреть сообщение
Либо поиском пользоваться разучился, либо действительно нет ничего вменяемого по теме. Может кто ни будь сможет объяснить что такое явный и неявный указатель?
C++
1
2
3
4
5
SomeClass* Ptr = NULL; //явный указатель
 
 (Ptr+2) -> Method();  //Выражение слева в скобках породит 
                                 //неявный, временный указатель
                                 // через который будит запущен метод
Неявные указатели - это самые обычные указатели, которые создаются скрытно от программиста.
Как правило, они являются "временными" объектами.
1
Заблокирован
30.11.2011, 00:26
Цитата Сообщение от Bers Посмотреть сообщение
C++
1
2
3
4
5
SomeClass* Ptr = NULL; //явный указатель
 
 (Ptr+2) -> Method();  //Выражение слева в скобках породит 
                                 //неявный, временный указатель
                                 // через который будит запущен метод
Неявные указатели - это самые обычные указатели, которые создаются скрытно от программиста.
Как правило, они являются "временными" объектами.
Я просмотрел стандарт С++ и не нашел там такого термина, как "неявные указатели".
1
 Аватар для alkagolik
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548
30.11.2011, 00:30
Bers, это понятно, а как будет выглядеть в Си?

Добавлено через 4 минуты
боюсь что товарищ тарас просто ввел всех в заблуждение
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
30.11.2011, 00:34
Цитата Сообщение от alkagolik Посмотреть сообщение
это понятно, а как будет выглядеть в Си?
В стандарте Си тоже нет такого термина.
Цитата Сообщение от alkagolik Посмотреть сообщение
боюсь что товарищ тарас просто ввел всех в заблуждение
Любят же некоторые выдумывать собственную терминологию. А потом еще хотят, чтобы их понимали остальные.
0
Заблокирован
30.11.2011, 01:28
Да причем тут терминология вообще? Указатель, который создаётся неявно - это блин, неявный указатель. Указатель, который создаётся явно - явный.
0
Заблокирован
30.11.2011, 01:33
Цитата Сообщение от Bers Посмотреть сообщение
Да причем тут терминология вообще? Указатель, который создаётся неявно - это блин, неявный указатель. Указатель, который создаётся явно - явный.
Подайте свое предложение в комитет по стандартизации. Если тот примет ваше предложение, то будем пользоваться вашими терминами. А пока в стандарте есть термины о явных и неявных преобразованиях типов выражений. Например, массив неявно преобразуется в указатель на его первый элемент при передачи массива в качестве аргумента функции, если параметр объявлен как массив. Но тем не менее указатель от этого не становится неявным. То есть я хочу сказать, что ваша терминология вашего определение указателя может лишь запутывать других.

Дело в том, что, например, в стандарте встречается выражение "явный указатель" (explicit pointer), но несколько в ином смысле, чем вы это себе представляете.
0
Заблокирован
30.11.2011, 01:41
Цитата Сообщение от Сыроежка Посмотреть сообщение
Дело в том, что, например, в стандарте встречается выражение "явный указатель" (explicit pointer), но несколько в ином смысле, чем вы это себе представляете.
В каком?

Кстати, всегда думал, что "массив" на с++ это и есть указатель на первый элемент массива.
То бишь, на с++ никаких "массивов" не существует. Существуют непрерывные блоки памяти, и указатель на первый элемент.
0
Заблокирован
30.11.2011, 01:46
Цитата Сообщение от Bers Посмотреть сообщение
В каком?

Кстати, всегда думал, что "массив" на с++ это и есть указатель на первый элемент массива.
То бишь, на с++ никаких "массивов" не существует. Существуют непрерывные блоки памяти, и указатель на первый элемент.
То же неправильный вывод. В С/С++ массивы существуют. Просто имя массива не является lvalue и является синонимом адреса массива.
0
Заблокирован
30.11.2011, 01:50
Вот например:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
struct Some 
{  
    int a; 
    void View() { std::cout <<"ля-ля-ля\n";}
};
 
int main()
{
 
    STD;
 
    Some test; test.a;
    Some* ptr= &test;
 
    ptr[0].View(); //яж массив не создавал,
                        // но тем менее это работает
 
    ptr[100].View(); //хи-хи-хи
 
    //И кстати, работа с указателем посредством индекса
    //Предполагает создание временного объекта
    //Тобишь, доступ к данным, через неявный указатель. 
  
    EndProgramm();
}
Добавлено через 2 минуты
Цитата Сообщение от Сыроежка Посмотреть сообщение
То же неправильный вывод. В С/С++ массивы существуют. Просто имя массива не является lvalue и является синонимом адреса массива.
Я конечно понимаю, что тарасовская терминология, которую я нахожу не столько терминологией, сколько "называнием вещей своими именами" может быть упоротая)))

Но вопрос остаётся в силе: почему ж тогда семантика работы с "массивом" на с++ и семантика работы с "указателем" на с++ - абсолютно идентичная?

Чем тогда вообще массив принципиально отличается от указателя на первый элемент блока данных?
0
 Аватар для alkagolik
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548
30.11.2011, 01:55
Bers, массив, это вообще аппаратный термин, просто он перекочевал в высокоуровневое программирование (наверное для облегчения понимания, неважно), а фактически да, вы правы. А по указателям, так нету никаких явных или неявных, есть просто указатели, как реализация метода адресации.

Добавлено через 3 минуты
Цитата Сообщение от fasked Посмотреть сообщение
В стандарте Си тоже нет такого термина.
это был вопрос "с подвохом"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.11.2011, 01:55
Помогаю со студенческими работами здесь

Использование показателей при работе с массивами
n натуральное, a1,...,an действительные числа. Найти : a1a2n+a2a2n-1+...+anan+1

Использование показателей при работе с массивами
Даны a1,...,an действительные числа, n* натуральное число. Если в этой последовательности присутствуют три меньших числа,вывести на экран...

Проблемма при работе с массивами структур
Разработать программу , позволяющую добавлять данные структур с указанными полями в массив, просматривать массивы, а также выполнять...

Указатели при работе со строками char*
Помогите разобраться с указателями #include &lt;iostream&gt; #include &lt;string.h&gt; using namespace std; int main() { char*...

Ошибка в перегрузке оператора - при работе с массивами
Текст программы: #include &lt;iostream&gt; #include &lt;windows.h&gt; using namespace std; class array { public: array(); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Закрытая тема Создать тему
Новые блоги и статьи
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru