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

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

28.11.2011, 16:03. Показов 11281. Ответов 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
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
01.12.2011, 11:50
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Гоблин Посмотреть сообщение
Только что в универе подходил к преподавателю С++
Цитата Сообщение от Гоблин Посмотреть сообщение
то есть s - то, что простые смертные называют неявным или скрытым указателем
Фэйспалм
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
01.12.2011, 11:54
Цитата Сообщение от Гоблин Посмотреть сообщение
Только что в универе подходил к преподавателю С++.
С такими преподавателями и враги не нужны...

Добавлено через 44 секунды
Вот что бывает, когда учат Си, для последующего изучения С++. Пытаются подогнать новые знания под старые понятия...
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
01.12.2011, 12:55
Цитата Сообщение от Гоблин Посмотреть сообщение
Найдите отличия) Во втором случае как раз и происходит неявное разыменование, то есть s - то, что простые смертные называют неявным или скрытым указателем.
Смело бросайте в вашего препода камнем, так как он обозвал мальчика девочкой...
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
01.12.2011, 15:09
Цитата Сообщение от Гоблин Посмотреть сообщение
Явный и неявный действительно условные названия, однако ими почему-то все пользуются.
Нифига подобного. Явный - это тот, который прописан в исходнике, а неявный - тот, что в коде существует, но в исходнике его не видно. И ни каких условностей.

Добавлено через 2 минуты
Цитата Сообщение от Гоблин Посмотреть сообщение
Найдите отличия) Во втором случае как раз и происходит неявное разыменование, то есть s - то, что простые смертные называют неявным или скрытым указателем.
Ну и где ж оно у тебя неявное то, когда оно явно прописано в теле функции?

Добавлено через 2 минуты
Цитата Сообщение от alkagolik Посмотреть сообщение
я вас разочарую, всякие там "переменные" или "объекты" существуют лишь в теории на приктике же есть память и ее адрес и всьо.
Ты где это вообще откопал?
C++
1
2
3
4
5
class A
{
 ...
};
A a;// Объект. Вполне существующий в таком коде. И на практике как раз пишут именно так. Адрес же этого объекта как раз существует только на низком уровне, да в теории.
0
 Аватар для Гоблин
1 / 1 / 1
Регистрация: 17.10.2010
Сообщений: 29
01.12.2011, 15:34
Цитата Сообщение от Bers Посмотреть сообщение
это ссылка)
Несовсем. Ссылку вернет &s, а вот s в теле функции будет работать как указатель.
Цитата Сообщение от taras atavin Посмотреть сообщение
Нифига подобного. Явный - это тот, который прописан в исходнике, а неявный - тот, что в коде существует, но в исходнике его не видно. И ни каких условностей.
Ну так верно ведь говорите! О чем тогда спор?..
Цитата Сообщение от taras atavin Посмотреть сообщение
Ну и где ж оно у тебя неявное то, когда оно явно прописано в теле функции?
Поясняю. Поправьте, если буду неправ.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <conio.h>
#include <stdio.h>
 
void func(int *A, int &s) {
  s = A[1];
}
 
void main() {
  int s = 0;
  int *A = new int [2];
  A[0] = 0;
  A[1] = 1;
  A[2] = 2;
  func(A,s);
  printf("%d",s);
  getch();
  delete []A;
}
В этом примере функция func изменит значение s. А как, если у функция ничего не возвращает и в саму функцию мы передаем только адрес переменной?
Насколько я понимаю, в строке s = A[1]; компилятор как раз будет обращаться к указателю на переменную s, то есть разыменовывание будет происходить неявно. То есть в шапке фактически написано *s = &ToChtoPeredanoVFunkciоu. Или я не прав? В конечном счете значение массива заносится по адресу переменной переданной в функцию, а не в переменную. Со ссылкой насколько я помню такой прием не пройдет.

Добавлено через 2 минуты
Цитата Сообщение от taras atavin Посмотреть сообщение
Ты где это вообще откопал?
Насколько я понимаю как раз об этом речь и шла: классы это всего лишь программные конструкции, в конечном итоге объект это ссылка на начало объекта в памяти.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
01.12.2011, 16:58
Цитата Сообщение от Гоблин Посмотреть сообщение
а вот s в теле функции будет работать как указатель.
Как ссылка.

Добавлено через 1 минуту
Цитата Сообщение от Гоблин Посмотреть сообщение
компилятор как раз будет обращаться к указателю на переменную s, то есть разыменовывание будет происходить неявно
Разыменование - это синтаксическая конструкция, она не возможна неявно. На низком же уровне вообще нет ни каких разыменований, а есть два способа доступа к памяти: прямой и косвенный. Косвенный - это по адресу в данном, прямой - по адресу в коде.

Добавлено через 3 минуты
Цитата Сообщение от Гоблин Посмотреть сообщение
Насколько я понимаю как раз об этом речь и шла: классы это всего лишь программные конструкции, в конечном итоге объект это ссылка на начало объекта в памяти.
Так говорить не правильно. Ссылка может быть только на переменную, но не на адрес. В крайнем случае ссылка на указатель, а уже его значение есть адрес. И в ИТ вообще не существует ничего, кроме аппаратного обеспечения и программных конструкций. И от того, что последние - лишь информация, ничего принципиально не меняется. Информация столь же реальна, как и вещество, энергия, время и пространство. Информация - пятая сущность. Идеальная, но равная четырём остальным. И если в одном из представлений программы, да ещё и в исходном ко всему прочему, существуют имена переменных, значит и имена эти реальны, так как любые представления чего бы то ни было - информация.

Добавлено через 12 минут
Информация есть любые сведения о мире, реальном, или вымышленном, не зависимо от их истинности, или ложности.
Сведения могут быть ложными, то есть не соответствовать действительности того мира, к которому относятся, но само высказывание, записанное, или произнесённое, реально существует.
0
 Аватар для Гоблин
1 / 1 / 1
Регистрация: 17.10.2010
Сообщений: 29
01.12.2011, 17:05
Цитата Сообщение от taras atavin Посмотреть сообщение
Как ссылка.
Погуглил, проверил... Действительно ссылка. Пардон.
0
 Аватар для alkagolik
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548
01.12.2011, 20:56
Цитата Сообщение от taras atavin Посмотреть сообщение
Нифига подобного. Явный - это тот, который прописан в исходнике, а неявный - тот, что в коде существует, но в исходнике его не видно. И ни каких условностей.
ссылку на официальный текст.

Добавлено через 6 минут
Цитата Сообщение от taras atavin Посмотреть сообщение
Ты где это вообще откопал?
я порсто когда читаю что-то вроде "создаем объект в памяти" или "у нас в памяти есть переменная" то невольно меня "коробит", т.к. объект или переменная это и есть область памяти, но это опять же не по теме.
0
Заблокирован
01.12.2011, 21:36
Цитата Сообщение от alkagolik Посмотреть сообщение
ссылку на официальный текст.
Ты похоже в танке.

Ну бывает да.. вроде бы поговорили, разобрались. Человек вроде бы даже сам осознал, что "явность/неявность" к терминологии отношения не имеет.
Проходят сутки, и он начинает тупить опять на ту же самую тему.

Добавлено через 7 минут
Цитата Сообщение от alkagolik Посмотреть сообщение
порсто когда читаю что-то вроде "создаем объект в памяти" или "у нас в памяти есть переменная" то невольно меня "коробит", т.к. объект или переменная это и есть область памяти,
C++
1
Some* ptr = new Some; //я вот так создаю объект в динамической памяти? А ты?
Ты понятия не попутал? Ну там, ассмеблер с ООП в голове не перепутались?
0
 Аватар для alkagolik
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548
01.12.2011, 22:07
Bers, ты главное не кипятись. Твой пример говорит компилятору не "создай мне объект в куче", а "дай память для *ptr, дай sizeof(Some) памяти из кучи, положи адрес начала участка в ячейку с адресом ptr ". На ооп свет клином не сходится.
0
Заблокирован
01.12.2011, 22:13
Цитата Сообщение от alkagolik Посмотреть сообщение
Bers, ты главное не кипятись. Твой пример говорит компилятору не "создай мне объект в куче", а "дай память для *ptr, дай sizeof(Some) памяти из кучи, положи адрес начала участка в ячейку с адресом ptr ". На ооп свет клином не сходится.

Ты пойми одну вещь: когда ты говоришь "объект", ты уже используешь ООП. Ты как минимум, используешь терминологию ООП.

А что такое объект с точки зрения ООП? А... то-то же.

А ты для высокоуровневой абстракции ООП применяешь низкоуровневые определения. Что у тебя вы итоге получается? Чача в голове.
0
 Аватар для alkagolik
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548
01.12.2011, 23:25
Bers, ну это все мы с тобой "вилами по воде пишем". Я говорю что объект, переменная не могут быть в памяти. Говоря объект или переменная мы маскИруем этими терминами память, адреса.
Цитата Сообщение от wiki
Объект(программирование) — некоторая сущность в виртуальном пространстве
т.е. их нет фактически, например комплексные числа. Поместить объект в память на мой взгляд то же что положить воду в воду, небо в небо. У кого чача...?.
0
01.12.2011, 23:30
 Комментарий модератора 
Bers, alkagolik, может вы это как-то в личке обсудите? У кого из вас где чача, вряд ли кому-то кроме вас самих интересно...
0
Заблокирован
01.12.2011, 23:37
alkagolik, ты понимаешь, ты втискиваешь высокоуровневые абстракции в рамки низко-уровневых механизмов.

Поместить объект в память, значить ассоциировать область памяти с некой абстракцией.
Причем, на высоком уровне (ООП), программисту вообще не нужно думать, как работает механизм вот этой самой "ассоциации области памяти с объектом".

Для этого ООП и был создан, что бы программиста верхнего уровня избавить от необходимости знать, как это все работает на низком уровне.

А на низком уровне вообще не существует никаких абстракций. И после компиляции уже никто не знает о том, какой тип был у объекта. То есть, об этой высокоуровневой абстракции знают только программист, и только компилятор.

Поэтому, такую абстракцию и называют "абстракцией". То есть, программист верхнего уровня абстрагируется от низко-уровневых механизмов.

Ты же применяешь к высокоуровневым понятиям низкоуровневые определения.

Вот я тебе задал вопрос: что такое объект?
Это не область в памяти. Область памяти, ассоциированная с объектом - это лишь форма существования объекта на низком уровне. Причем, на таком низком уровне, где никаких объектов уже не существует.

А у тебя в голове чача из ассемблера и ООП.

Сам по себе объект в ООП в сферическом вакууме - это просто абстракция, которая обладает свойствами (данные-члены), и умениями (методы). Все.
1
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
02.12.2011, 06:56
Цитата Сообщение от Bers Посмотреть сообщение
Вот я тебе задал вопрос: что такое объект?
Это не область в памяти.
Цитирую Страуструпа (ему ведь можно верить?)
Имя обозначает (денотирует) объект, функцию, тип, значение или метку. Имя вводится в программе описанием (#8). Имя может использоваться только внутри области текста программы, называемой его областью видимости. Имя имеет тип, определяющий его использование. Объект - это область памяти. Объект имеет класс памяти, определяющий его время жизни. Смысл значения, обнаруженного в объекте, определяется типом имени, использованного для доступа к нему.
1
Заблокирован
02.12.2011, 14:48
Deviaphan, вот поэтому, я и не рекомендую новичкам ничего учить по Страуструпу.
Он гениальный программист, но педагог из него никудышный.

C++
1
2
3
4
5
6
7
8
9
10
class test {int a; }; //что означает ключевое слово class?
 
int main()
{
    
    auto test foo; //я создал область памяти, или как?
    //и что означат ключево слово auto?     
 
    EndProgramm();
}
Вот объясните. Но только что б согласно Страуструпу.

То есть, у вас должно быть что-то вроде: "я создал не сам объект, а только имя объекта. Объект за меня создал компилятор как то там", ну и в таком подобном духе.
Заодно, по страуструповски раскройте тему класса памяти, что бы никто гарантированно, не попутал класс памяти, с классом объекта.

Объясните так, что бы любой новичок сумел вас вразуметь.
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
02.12.2011, 15:19
Цитата Сообщение от Bers Посмотреть сообщение
Вот объясните.
Ваш код не компилируется, т.к. он более не соответствует стандарту.
По старому стандарту, слово auto уже 100500 лет ничего не значит.

Классы памяти: стековая и динамическая (из пула). Регистровую память специально игнорирую, т.к. управлять регистрами низя.

Цитата Сообщение от Bers Посмотреть сообщение
но педагог из него никудышный
Считаешь, создатель данного языка путается в терминологии сильнее тебя?
0
Заблокирован
02.12.2011, 15:39
Цитата Сообщение от Deviaphan Посмотреть сообщение
Ваш код не компилируется, т.к. он более не соответствует стандарту.
а что с ним не так? 2008 компилирует, выдавая варнинг "неиспользуемая переменная"

Цитата Сообщение от Deviaphan Посмотреть сообщение
Классы памяти: стековая и динамическая (из пула). Регистровую память специально игнорирую, т.к. управлять регистрами низя.
Вы думаете, новичок, который впервые слышет о каких там классах памяти, сразу поймёт что это такое, и о чем вапще идет речь?

Я вас попросил: что это такое?
Вы не объяснили. Даже определения не дали.

А я вам скажу: первое, о чем подумает новичок, при словосочетании "класс памяти" - это о классах с++.

И даже когда в книгах по winAPI встречается впервые записулька типа: "структура, описывающая класс окна" - многие новички тут же теряются. И не понимают, где тут класс окна, и при чем тут вообще класс?

Если сейчас нашу переписку будит читать новичок, он уже не будит понимать о чем речь.

Цитата Сообщение от Deviaphan Посмотреть сообщение
Считаешь, создатель данного языка путается в терминологии сильнее тебя?
Считаю, что создатель мыслит очень "компактно".
В приведенной вами цитате на самом деле заложено столько материала, что этого хватит на написания несколько крупных глав в моральном учебном пособии.

С позиции своего опыта и знаний, я могу ещё как то прожевать, как это: "Отдельная область памяти ассоциируется с некой абстракцией, называемой объектом".

А вот понять, что "некая абстракция и есть область памяти" - для меня это уже перебор.

Ответьте хотя вот на этот вопрос:

C++
1
test foo; //я создал область памяти, или как?
Вот я считаю, что я создал объект. Имя объекта - foo, а тип объекта - test
Здесь был по умолчанию задействован класс памяти auto.
И компилятор сам разберётся как именно создать объект, где он будит жить, и какое время его жизни. Мне, как программисту высокого уровня, об это думать вообще не нужно.

Страуструп же считает, что на самом деле здесь было создано только имя объекта, которое имеет тип.

А вот за само создание объекта отвечает класс памяти этого объекта.

Хорошо... пусть так. Пусть это будит более точным описанием действа.

Имя объекта создано, тип его известен, класс памяти отработал. Объект создан.

Вопрос: что именно было создано? Область памяти была создана, или как?

Я понимаю так: некоторая область памяти была ассоциирована с объектом. И теперь байты этой области являются данными этого объекта.

А как понимаете это вы?
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
02.12.2011, 15:45
Цитата Сообщение от Bers Посмотреть сообщение
И даже когда в книгах по winAPI встречается впервые записулька типа: "структура, описывающая класс окна" - многие новички тут же теряются. И не понимают, где тут класс окна, и при чем тут вообще класс?
А ничего что WINAPI никакого отношения к C++ не имеет?
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
02.12.2011, 15:59
Цитата Сообщение от Bers Посмотреть сообщение
2008 компилирует
Он устаревший.

Цитата Сообщение от Bers Посмотреть сообщение
при словосочетании "класс памяти" - это о классах с++.
Это проблемы новичка.

Цитата Сообщение от Bers Посмотреть сообщение
Страуструп же считает, что на самом деле здесь было создано только имя объекта, которое имеет тип.
Нет. Страуструп считает не так. Страуструп считает, что был создан объект (область памяти), которая ассоциирована с классом(типом) Test и имеет имя foo. Я же буквально на днях в твоём же вопросе про множественное наследование привёл пример вообще без наследования, где как раз изменял класс объекта, используя один и тот же физический объект. Пример был не корректен, но в данном случае он явно указывает на то, что имел ввиду Страуструп и чего ты не хочешь принять.

Цитата Сообщение от Bers Посмотреть сообщение
А вот за само создание объекта отвечает класс памяти этого объекта.
Нет. Класс памяти означает создан объект на стеке или в куче.

Цитата Сообщение от Bers Посмотреть сообщение
класс памяти отработал
Как я уже сказал выше, класс памяти не может отработать. В принципе не может. Это не код.

Цитата Сообщение от Bers Посмотреть сообщение
Я понимаю так: некоторая область памяти была ассоциирована с объектом. И теперь байты этой области являются данными этого объекта.
Область памяти и есть объект. А ассоциирован объект с классом.

Щяс попробую более простой вариант сформулировать, чтобы тебе понятнее было.

Добавлено через 7 минут
Сперва пример, который вписывается в твоё мировозрение
C++
1
2
int * i = new int;
float * f = new float;
Ты не будешь спорить, что i - указатель на объект типа int, а f на float. Класс памяти динамический у обоих.

Второй пример
C++
1
2
3
BYTE * ptr = new BYTE[4];
int * i = (int*)ptr;
float * f = (float*)ptr;
i по прежнему указывает на объект типа int, а f на объект типа float. Как видишь, одна и та же область памяти(объект) ассоциируется с разными классами (типами).

Добавлено через 59 секунд
Цитата Сообщение от fasked Посмотреть сообщение
. И не понимают, где тут класс окна, и при чем тут вообще класс?
Новички вообще много чего не понимают...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.12.2011, 15:59
Помогаю со студенческими работами здесь

Использование показателей при работе с массивами
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(); ...


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

Или воспользуйтесь поиском по форуму:
100
Закрытая тема Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 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
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru