Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 46, средняя оценка - 4.65
chainiksi
0 / 0 / 0
Регистрация: 15.11.2011
Сообщений: 25
28.11.2011, 16:03     Как использовать указатели при работе с массивами? #1
подскажите пожалуйста как правильно использовать указатели при работе с массивами. Как написать этк программу используя указатели?
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]и т.п.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
01.12.2011, 11:50     Как использовать указатели при работе с массивами? #81
Цитата Сообщение от Гоблин Посмотреть сообщение
Только что в универе подходил к преподавателю С++
Цитата Сообщение от Гоблин Посмотреть сообщение
то есть s - то, что простые смертные называют неявным или скрытым указателем
Фэйспалм
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
01.12.2011, 11:54     Как использовать указатели при работе с массивами? #82
Цитата Сообщение от Гоблин Посмотреть сообщение
Только что в универе подходил к преподавателю С++.
С такими преподавателями и враги не нужны...

Добавлено через 44 секунды
Вот что бывает, когда учат Си, для последующего изучения С++. Пытаются подогнать новые знания под старые понятия...
BRcr
 Аватар для BRcr
4003 / 2292 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
01.12.2011, 12:55     Как использовать указатели при работе с массивами? #83
Цитата Сообщение от Гоблин Посмотреть сообщение
Найдите отличия) Во втором случае как раз и происходит неявное разыменование, то есть s - то, что простые смертные называют неявным или скрытым указателем.
Смело бросайте в вашего препода камнем, так как он обозвал мальчика девочкой...
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
01.12.2011, 15:09     Как использовать указатели при работе с массивами? #84
Цитата Сообщение от Гоблин Посмотреть сообщение
Явный и неявный действительно условные названия, однако ими почему-то все пользуются.
Нифига подобного. Явный - это тот, который прописан в исходнике, а неявный - тот, что в коде существует, но в исходнике его не видно. И ни каких условностей.

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

Добавлено через 2 минуты
Цитата Сообщение от alkagolik Посмотреть сообщение
я вас разочарую, всякие там "переменные" или "объекты" существуют лишь в теории на приктике же есть память и ее адрес и всьо.
Ты где это вообще откопал?
C++
1
2
3
4
5
class A
{
 ...
};
A a;// Объект. Вполне существующий в таком коде. И на практике как раз пишут именно так. Адрес же этого объекта как раз существует только на низком уровне, да в теории.
Гоблин
 Аватар для Гоблин
1 / 1 / 0
Регистрация: 17.10.2010
Сообщений: 29
01.12.2011, 15:34     Как использовать указатели при работе с массивами? #85
Цитата Сообщение от 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 Посмотреть сообщение
Ты где это вообще откопал?
Насколько я понимаю как раз об этом речь и шла: классы это всего лишь программные конструкции, в конечном итоге объект это ссылка на начало объекта в памяти.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
01.12.2011, 16:58     Как использовать указатели при работе с массивами? #86
Цитата Сообщение от Гоблин Посмотреть сообщение
а вот s в теле функции будет работать как указатель.
Как ссылка.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

А как понимаете это вы?
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
02.12.2011, 15:45     Как использовать указатели при работе с массивами? #99
Цитата Сообщение от Bers Посмотреть сообщение
И даже когда в книгах по winAPI встречается впервые записулька типа: "структура, описывающая класс окна" - многие новички тут же теряются. И не понимают, где тут класс окна, и при чем тут вообще класс?
А ничего что WINAPI никакого отношения к C++ не имеет?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.12.2011, 15:59     Как использовать указатели при работе с массивами?
Еще ссылки по теме:

C++ Использование функций при работе с двумерными массивами
C++ Проблемма при работе с массивами структур
Ошибка с памятью при работе с двумерными массивами. C++

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

Или воспользуйтесь поиском по форуму:
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
02.12.2011, 15:59     Как использовать указатели при работе с массивами? #100
Цитата Сообщение от 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 Посмотреть сообщение
. И не понимают, где тут класс окна, и при чем тут вообще класс?
Новички вообще много чего не понимают...
Yandex
Объявления
02.12.2011, 15:59     Как использовать указатели при работе с массивами?
Закрытая тема Создать тему
Опции темы

Текущее время: 05:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru