1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 66
1

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

16.06.2014, 21:59. Показов 1709. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
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; ...

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

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

11
433 / 368 / 149
Регистрация: 06.08.2012
Сообщений: 961
16.06.2014, 22:02 2
dicros, второй пример дан для лучшего понимания работы указателей и связи их с массивами. В данном случае конечно же проще первый вариант.
1
16 / 16 / 10
Регистрация: 16.06.2014
Сообщений: 180
16.06.2014, 22:10 3
вот это
Цитата Сообщение от dicros Посмотреть сообщение
mas[i]
компилятор и так переводит в
Цитата Сообщение от dicros Посмотреть сообщение
*(mas+i)
Добавлено через 2 минуты
можно даже написать
C++
1
i[mas]
разницы нет, что *(mas+i) что *(i+mas)
0
Модератор
Эксперт по электронике
8695 / 6493 / 879
Регистрация: 14.02.2011
Сообщений: 22,714
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));
0
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 66
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; //правильная

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

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

Добавлено через 4 минуты
Цитата Сообщение от dicros Посмотреть сообщение
а жаль
не, ну в принципе можно
на уровне ядра, только уровень знаний должен быть очень большой
про винду рекомендую почитать книги\статьи Руссиновича
http://ru.wikipedia.org/wiki/Руссинович,_Марк
0
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 66
16.06.2014, 23:41  [ТС] 12
ValeryS, спасибо обязательно почитаю.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.06.2014, 23:41
Помогаю со студенческими работами здесь

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

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru