С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
 Аватар для dicros
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 66

Разница в обращении к массиву по индексу и по указателю

16.06.2014, 21:59. Показов 2341. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дочитал до главы "Указатели" и возникли вопросы, если у кого найдется время подскажите

Вот пример:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
 
int main()
{
 int mas[5]={31,54, 77, 52, 93};
 
for(int i=0; i<5; i++)
{
  cout << mas[i] << endl;
}
 
return 0;
};

А вот тот же самый пример но с использованием указателей:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
 
int main()
{
 int mas[5]={31,54, 77, 52, 93};
 
for(int i=0; i<5; i++)
{
  cout << *(mas+i) << endl;
}
 
return 0;
};


Вопрос есть ли смысл использовать указатели? ведь пример и без них прекрасно работает. И даже старый способ записи удобней и привычней. Есть ли смысл отучаться от старого и пользоваться новым? Или разницы между ними нет и можно пользоваться любым???
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.06.2014, 21:59
Ответы с готовыми решениями:

Почему при обращении по индексу к массиву с модификатором readonly мы можем записывать значение
Народ объясните новичку почему при обращении по индексу к массиву с модификатором readonly мы можем записывать значение ? Собственно...

Ошибка при обращении к указателю: maybe you mean to use '->'
#include &lt;windows.h&gt; #include &lt;stdio.h&gt; #include &lt;conio.h&gt; struct book { char avtor; //fio char caption; ...

Access violation при обращении по указателю
_CommandPtr pCmd = NULL; _ParameterPtr Var1; Var1 = pCmd-&gt;CreateParameter(_bstr_t(&quot;@T&quot;), adInteger, adParamOutput, 0, codRet); ...

11
433 / 368 / 149
Регистрация: 06.08.2012
Сообщений: 961
16.06.2014, 22:02
dicros, второй пример дан для лучшего понимания работы указателей и связи их с массивами. В данном случае конечно же проще первый вариант.
1
 Аватар для 4unkur
16 / 16 / 10
Регистрация: 16.06.2014
Сообщений: 180
16.06.2014, 22:10
вот это
Цитата Сообщение от dicros Посмотреть сообщение
mas[i]
компилятор и так переводит в
Цитата Сообщение от dicros Посмотреть сообщение
*(mas+i)
Добавлено через 2 минуты
можно даже написать
C++
1
i[mas]
разницы нет, что *(mas+i) что *(i+mas)
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
16.06.2014, 22:12
Цитата Сообщение от dicros Посмотреть сообщение
Вопрос есть ли смысл использовать указатели?
Есть
Это очень удобная, но коварная штука
как нож обоюдоострый, не умеешь пользоваться обязательно порежешься
вот пример как при помощи указателя вытащить байты из которых состоит число 0.5
C++
1
2
3
4
double db=0.5;
unsigned char *pch=&db;
for(int i=0;i<sizeof(double);i++)
  printf("%x",ch[i]);
тоже самое но с адресной арифметикой

C++
1
2
3
4
double db=0.5;
unsigned char * pch=&db;
for(int i=0;i<sizeof(double);i++)
  printf("%x",*(ch+i));
0
 Аватар для dicros
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 66
16.06.2014, 22:19  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
double db=0.5;
unsigned char *pch=&db;
Как это возможно? ведь должна быть ошибка. Вот только что читал что типы должны быть одинаковыми либо тип void


т.е. запись

int var=10;
int* ptr=&var; //правильная
char* ptr=&var; //не правильная ошибка
void* ptr=&var; //правильная

или я опять что то упустил?
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
16.06.2014, 22:34
Цитата Сообщение от dicros Посмотреть сообщение
Как это возможно?
возможно
неявное приведение
Цитата Сообщение от dicros Посмотреть сообщение
ведь должна быть ошибка.
может быть предупреждение. или ошибка у особо рьяных компиляторов
лечится явным приведением
C
1
unsigned char *pch=(unsigned char *)&db;
в том то и сила указателей, а равно и опасность
что все можно привести к всему
при неправильном использовании крах программы обеспечен
ближайшее где тебе могут понадобится указатели это передача параметров в функцию

Добавлено через 2 минуты
например знаменитая
C++
1
2
int a;
scanf("%i",&a);
если написать так scanf("%i",a); то в функцию попадет копия a и все изменения в ней и умрут
а так мы говорим измени-ка нам переменную которая лежит по такому адресу
0
 Аватар для dicros
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 66
16.06.2014, 22:41  [ТС]
Еще появился вопросик

Предположим у меня есть какая то игра и в ней деньги на которые я могу что-то покупать и тд... или здоровье(это неважно). Я могу узнать в какой области памяти она хранит свои значения просканировать ее(участок памяти) на наличии допустим числа 800 и, после того как она найдет это число просто с помощью указателя перезаписать его на то которое мне нужно. И у меня в игре число тоже изменится???

Добавлено через 6 минут
Цитата Сообщение от ValeryS Посмотреть сообщение
ближайшее где тебе могут понадобится указатели это передача параметров в функцию
Добавлено через 2 минуты
например знаменитая
Код C++
1
2
int a;
scanf("%i",&a);
если написать так scanf("%i",a); то в функцию попадет копия a и все изменения в ней и умрут
а так мы говорим измени-ка нам переменную которая лежит по такому адресу

Но ведь есть передача по ссылке, она делает тоже самое
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using namespace std;
 
void test(int&);
int main()
{
 
    int var = 10;
    cout << "var=" << var << endl;
 
    test(var);
    cout << "var=" << var << endl;
    return 0;
};
 
void test(int& n)
{
    n *= 10;
};
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
16.06.2014, 22:44
Цитата Сообщение от dicros Посмотреть сообщение
Но ведь есть передача по ссылке, она делает тоже самое
Да
но во первых ссылка появилась относительно недавно
во вторых ссылка это есть разыменованный указатель
Цитата Сообщение от dicros Посмотреть сообщение
Я могу узнать в какой области памяти она хранит свои значения просканировать ее(участок памяти) на наличии допустим числа 800 и, после того как она найдет это число просто с помощью указателя перезаписать его на то которое мне нужно. И у меня в игре число тоже изменится???
Во времена ДОС так и делалось, теперь в современных ОС система тебе не даст хулиганить в чужой памяти
2
 Аватар для 4unkur
16 / 16 / 10
Регистрация: 16.06.2014
Сообщений: 180
16.06.2014, 22:48
с указателями можно еще выделить динамическую память
0
 Аватар для dicros
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 66
16.06.2014, 22:50  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
Во времена ДОС так и делалось, теперь в современных ОС система тебе не даст хулиганить в чужой памяти
а жаль .

На данный момент так и не понятно в чем преимущество этого "Указателя", но раз ты говоришь что он необходим прислушаюсь будем значит учить! Если модераторы будут не против дабы не создавать новых тем буду писать сюда если возникнут вопросы (а они возникнут ))) ).
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
16.06.2014, 23:00
Цитата Сообщение от dicros Посмотреть сообщение
Если модераторы будут не против дабы не создавать новых тем буду писать сюда если возникнут вопросы
Я думаю что дело не в недовольстве модераторов, а в том что тема разрастется на несколько десятков страниц и будет трудно ориентироваться
так что, по моему лучше на каждый вопрос своя тема, а сюда можно кидать ссылки

Добавлено через 4 минуты
Цитата Сообщение от dicros Посмотреть сообщение
а жаль
не, ну в принципе можно
на уровне ядра, только уровень знаний должен быть очень большой
про винду рекомендую почитать книги\статьи Руссиновича
http://ru.wikipedia.org/wiki/Руссинович,_Марк
0
 Аватар для dicros
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 66
16.06.2014, 23:41  [ТС]
ValeryS, спасибо обязательно почитаю.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.06.2014, 23:41
Помогаю со студенческими работами здесь

Ошибка при обращении по не инициализированному указателю
При нажатии на кнопку &quot;Нарисовать&quot;, выбивает ошибку Я поискал, что это за ошибка. Она появляется, если используется указатель NULL Но,...

Не срабатывает событие при обращении к кнопке по индексу
Почему не срабатывает событие? Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)...

Почему не происходит ошибка при обращении к недопустимому индексу
#include &lt;string&gt; int main() { std::string s; s; } Исключения не происходит. Внимание вопрос: я схожу с ума, я не знаю цпп...

Ошибка при обращении к массиву
public class PrintText{ public String arrayString = {&quot;ivanov;Ivan Ivanov;ivanov@mail.ru&quot;,&quot;ivanov;Ivan Ivanov;ivanov@mail.ru&quot;,...

Инкремент при обращении (н-р к массиву)
int _id_; char _string_; _string_ // Изменится ли в этом случаее _id_ или это не повлеяет на начего?


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru