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

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

Восстановить пароль Регистрация
 
dicros
 Аватар для dicros
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 63
16.06.2014, 21:59     Разница в обращении к массиву по индексу и по указателю #1
Дочитал до главы "Указатели" и возникли вопросы, если у кого найдется время подскажите

Вот пример:

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;
};


Вопрос есть ли смысл использовать указатели? ведь пример и без них прекрасно работает. И даже старый способ записи удобней и привычней. Есть ли смысл отучаться от старого и пользоваться новым? Или разницы между ними нет и можно пользоваться любым???
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Issues
429 / 364 / 37
Регистрация: 06.08.2012
Сообщений: 961
16.06.2014, 22:02     Разница в обращении к массиву по индексу и по указателю #2
dicros, второй пример дан для лучшего понимания работы указателей и связи их с массивами. В данном случае конечно же проще первый вариант.
4unkur
 Аватар для 4unkur
16 / 16 / 6
Регистрация: 16.06.2014
Сообщений: 174
16.06.2014, 22:10     Разница в обращении к массиву по индексу и по указателю #3
вот это
Цитата Сообщение от dicros Посмотреть сообщение
mas[i]
компилятор и так переводит в
Цитата Сообщение от dicros Посмотреть сообщение
*(mas+i)
Добавлено через 2 минуты
можно даже написать
C++
1
i[mas]
разницы нет, что *(mas+i) что *(i+mas)
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
16.06.2014, 22:12     Разница в обращении к массиву по индексу и по указателю #4
Цитата Сообщение от 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));
dicros
 Аватар для dicros
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 63
16.06.2014, 22:19  [ТС]     Разница в обращении к массиву по индексу и по указателю #5
Цитата Сообщение от ValeryS Посмотреть сообщение
double db=0.5;
unsigned char *pch=&db;
Как это возможно? ведь должна быть ошибка. Вот только что читал что типы должны быть одинаковыми либо тип void


т.е. запись

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

или я опять что то упустил?
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
16.06.2014, 22:34     Разница в обращении к массиву по индексу и по указателю #6
Цитата Сообщение от dicros Посмотреть сообщение
Как это возможно?
возможно
неявное приведение
Цитата Сообщение от dicros Посмотреть сообщение
ведь должна быть ошибка.
может быть предупреждение. или ошибка у особо рьяных компиляторов
лечится явным приведением
C
1
unsigned char *pch=(unsigned char *)&db;
в том то и сила указателей, а равно и опасность
что все можно привести к всему
при неправильном использовании крах программы обеспечен
ближайшее где тебе могут понадобится указатели это передача параметров в функцию

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

Предположим у меня есть какая то игра и в ней деньги на которые я могу что-то покупать и тд... или здоровье(это неважно). Я могу узнать в какой области памяти она хранит свои значения просканировать ее(участок памяти) на наличии допустим числа 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;
};
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
16.06.2014, 22:44     Разница в обращении к массиву по индексу и по указателю #8
Цитата Сообщение от dicros Посмотреть сообщение
Но ведь есть передача по ссылке, она делает тоже самое
Да
но во первых ссылка появилась относительно недавно
во вторых ссылка это есть разыменованный указатель
Цитата Сообщение от dicros Посмотреть сообщение
Я могу узнать в какой области памяти она хранит свои значения просканировать ее(участок памяти) на наличии допустим числа 800 и, после того как она найдет это число просто с помощью указателя перезаписать его на то которое мне нужно. И у меня в игре число тоже изменится???
Во времена ДОС так и делалось, теперь в современных ОС система тебе не даст хулиганить в чужой памяти
4unkur
 Аватар для 4unkur
16 / 16 / 6
Регистрация: 16.06.2014
Сообщений: 174
16.06.2014, 22:48     Разница в обращении к массиву по индексу и по указателю #9
с указателями можно еще выделить динамическую память
dicros
 Аватар для dicros
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 63
16.06.2014, 22:50  [ТС]     Разница в обращении к массиву по индексу и по указателю #10
Цитата Сообщение от ValeryS Посмотреть сообщение
Во времена ДОС так и делалось, теперь в современных ОС система тебе не даст хулиганить в чужой памяти
а жаль .

На данный момент так и не понятно в чем преимущество этого "Указателя", но раз ты говоришь что он необходим прислушаюсь будем значит учить! Если модераторы будут не против дабы не создавать новых тем буду писать сюда если возникнут вопросы (а они возникнут ))) ).
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
16.06.2014, 23:00     Разница в обращении к массиву по индексу и по указателю #11
Цитата Сообщение от dicros Посмотреть сообщение
Если модераторы будут не против дабы не создавать новых тем буду писать сюда если возникнут вопросы
Я думаю что дело не в недовольстве модераторов, а в том что тема разрастется на несколько десятков страниц и будет трудно ориентироваться
так что, по моему лучше на каждый вопрос своя тема, а сюда можно кидать ссылки

Добавлено через 4 минуты
Цитата Сообщение от dicros Посмотреть сообщение
а жаль
не, ну в принципе можно
на уровне ядра, только уровень знаний должен быть очень большой
про винду рекомендую почитать книги\статьи Руссиновича
http://ru.wikipedia.org/wiki/Руссинович,_Марк
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.06.2014, 23:41     Разница в обращении к массиву по индексу и по указателю
Еще ссылки по теме:

Инкремент при обращении (н-р к массиву) C++
[Двусвязные списки] Добавление по индексу. Взятие адреса по индексу C++
C++ При обращении к индексу двумерного массива char программа вылетает с ошибкой

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

Или воспользуйтесь поиском по форуму:
dicros
 Аватар для dicros
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 63
16.06.2014, 23:41  [ТС]     Разница в обращении к массиву по индексу и по указателю #12
ValeryS, спасибо обязательно почитаю.
Yandex
Объявления
16.06.2014, 23:41     Разница в обращении к массиву по индексу и по указателю
Ответ Создать тему
Опции темы

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