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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
dicros
1 / 1 / 1
Регистрация: 24.04.2014
Сообщений: 64
#1

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

16.06.2014, 21:59. Просмотров 664. Ответов 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;
};


Вопрос есть ли смысл использовать указатели? ведь пример и без них прекрасно работает. И даже старый способ записи удобней и привычней. Есть ли смысл отучаться от старого и пользоваться новым? Или разницы между ними нет и можно пользоваться любым???
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.06.2014, 21:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Разница в обращении к массиву по индексу и по указателю (C++):

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

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

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

При обращении к индексу двумерного массива char программа вылетает с ошибкой - C++
Программа вылетает с ошибкой на 66й строке. Почему?((( // Task_1.cpp : Defines the entry point for the console application. // ...

Обращение к массиву по индексу, выходящему за его пределы - C++
Код: #include &lt;stdio.h&gt; #include &lt;string&gt; #include &lt;iostream&gt; #include &lt;fstream&gt; #define LINE &quot;\n ...

Передача аргумента в функцию по значению, по ссылке, по указателю: в чём концептуальная разница? - C++
Доброго всем здравия, прошу прощения, что достал уже всех этой темой. #include &lt;iostream&gt; using namespace std; int my_attemp(int...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Issues
430 / 365 / 37
Регистрация: 06.08.2012
Сообщений: 961
16.06.2014, 22:02 #2
dicros, второй пример дан для лучшего понимания работы указателей и связи их с массивами. В данном случае конечно же проще первый вариант.
4unkur
16 / 16 / 6
Регистрация: 16.06.2014
Сообщений: 176
16.06.2014, 22:10 #3
вот это
Цитата Сообщение от dicros Посмотреть сообщение
mas[i]
компилятор и так переводит в
Цитата Сообщение от dicros Посмотреть сообщение
*(mas+i)
Добавлено через 2 минуты
можно даже написать
C++
1
i[mas]
разницы нет, что *(mas+i) что *(i+mas)
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
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
1 / 1 / 1
Регистрация: 24.04.2014
Сообщений: 64
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
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
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
1 / 1 / 1
Регистрация: 24.04.2014
Сообщений: 64
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
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
16.06.2014, 22:44 #8
Цитата Сообщение от dicros Посмотреть сообщение
Но ведь есть передача по ссылке, она делает тоже самое
Да
но во первых ссылка появилась относительно недавно
во вторых ссылка это есть разыменованный указатель
Цитата Сообщение от dicros Посмотреть сообщение
Я могу узнать в какой области памяти она хранит свои значения просканировать ее(участок памяти) на наличии допустим числа 800 и, после того как она найдет это число просто с помощью указателя перезаписать его на то которое мне нужно. И у меня в игре число тоже изменится???
Во времена ДОС так и делалось, теперь в современных ОС система тебе не даст хулиганить в чужой памяти
4unkur
16 / 16 / 6
Регистрация: 16.06.2014
Сообщений: 176
16.06.2014, 22:48 #9
с указателями можно еще выделить динамическую память
dicros
1 / 1 / 1
Регистрация: 24.04.2014
Сообщений: 64
16.06.2014, 22:50  [ТС] #10
Цитата Сообщение от ValeryS Посмотреть сообщение
Во времена ДОС так и делалось, теперь в современных ОС система тебе не даст хулиганить в чужой памяти
а жаль .

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

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

Ошибка "Bad allocation" при обращении к массиву - C++
Такая проблема: выбивает bad allocation в 59 строке мейна. Запустите программу, введите 2 числа и выберите &quot;Сложение&quot;, введите &quot;0 1&quot;. ...

При повторном "обращении" к заранее созданному массиву последний элемент отображается неверно - C++
собственно заполняем массив int рандомом через функцию (ну в задании указано - заполнить через функцию, поэтому и такой ход). Потом из...

[Двусвязные списки] Добавление по индексу. Взятие адреса по индексу - C++
По заданию требуется: 1) Создать функцию void Insert(Person&amp; person, int index), помещающую переменную типа Person по указанному...

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
16.06.2014, 23:41
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru