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

Осмысление указателей - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
Putney88
0 / 0 / 0
Регистрация: 29.07.2013
Сообщений: 20
29.07.2013, 01:35     Осмысление указателей #1
Пожалуйста расскажите более популярным языком что это такое и для чего они нужны. Перечитал несколько раз пару дополнительных источников - не могу понять как они эффективно реализуются на деле..
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.07.2013, 01:38     Осмысление указателей #2
Книги пересказывать? Что конкретно непонятно?
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
29.07.2013, 02:54     Осмысление указателей #3
Цитата Сообщение от Putney88 Посмотреть сообщение
для чего они нужны.
Адреса переменных определённого типа хранить
nxtech
77 / 59 / 2
Регистрация: 26.06.2013
Сообщений: 198
29.07.2013, 07:45     Осмысление указателей #4
Ну, бывает, что и не совсем определенных типов. И не только переменых.
Wolkodav
 Аватар для Wolkodav
599 / 452 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
29.07.2013, 09:57     Осмысление указателей #5
Putney88, если честно на на тему "Эффективное использование указателей", "Как ими пользоваться" и т.д. по списку, можно курсачи писать. Очень трудно всё рассказать, где, зачем, почему и.т.д. Понимание приходит с опытом, написанием программ, чтение чужих кодов, и чтение литературы.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
29.07.2013, 10:10     Осмысление указателей #6
Putney88, допустим, есть некая сущность (переменная, функция ... ), указатель - это, в общем, адрес этой сущности.
Putney88
0 / 0 / 0
Регистрация: 29.07.2013
Сообщений: 20
30.07.2013, 13:30  [ТС]     Осмысление указателей #7
Хорошо, поставим вопрос иначе.
Для меня указатели равносильны операции присваиаания, так ли это?
И уже новый образовавшийся вопрос : с чего лучше начать практику с указателями.
Учусь по Шилдту. 3 базовый курс, усвоил циклы, массивы и все что было вплоть до указателей, иными словами зашел в тупик.
Wolkodav
 Аватар для Wolkodav
599 / 452 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
30.07.2013, 13:34     Осмысление указателей #8
Указатели это тип переменное, а присваивание это операция. Как они могут быть равносильны?

Добавлено через 1 минуту
Цитата Сообщение от Putney88 Посмотреть сообщение
уже новый образовавшийся вопрос : с чего лучше начать практику с указателями.
Да с самого элементарного. Операция разыменования, отличие ссылок и указателей, присваивание указателей, взятие адреса. Потом динамические массивы и т.д...
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
30.07.2013, 13:34     Осмысление указателей #9
Цитата Сообщение от Putney88 Посмотреть сообщение
Для меня указатели равносильны операции присваиаания, так ли это?
что за бред?
указатель - это сущность - адрес - число.
а операция это операция - это действие.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5548 / 2562 / 233
Регистрация: 01.11.2011
Сообщений: 6,333
Завершенные тесты: 1
30.07.2013, 13:39     Осмысление указателей #10
Цитата Сообщение от Jupiter Посмотреть сообщение
что за бред?
Наверное имелось в виду, что через указатели можно присвоить значение переменной, на которую они указывают.
Putney88
0 / 0 / 0
Регистрация: 29.07.2013
Сообщений: 20
30.07.2013, 13:58  [ТС]     Осмысление указателей #11
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Наверное имелось в виду, что через указатели можно присвоить значение переменной, на которую они указывают.
Да, я пытался это и сказать.
В теории я смотрю на это как на две одинаковые вещи.. не могу уловить различие..
Одно присваивает ячейку памяти другогой переменной.
Другое просто передает значение.
Извините за глупую наивность, я стараюсь это исправить..
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5548 / 2562 / 233
Регистрация: 01.11.2011
Сообщений: 6,333
Завершенные тесты: 1
30.07.2013, 14:09     Осмысление указателей #12
Putney88, пока вам не потребуются указатели, трудно будет вам объяснить зачем они нужны, да и все свистелки, которые можно с ними зачудить. А главное зачем это вообще все нужно. Пользуйтесь пока знакомыми вам переменными, и потихоньку начните разбираться с динамическими массивами - для первого примера.
Putney88
0 / 0 / 0
Регистрация: 29.07.2013
Сообщений: 20
30.07.2013, 14:16  [ТС]     Осмысление указателей #13
Пока все что вы делали - только восхищались что я сравниваю несравнимое.
Займусь динамическими массивами.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
30.07.2013, 14:24     Осмысление указателей #14
Цитата Сообщение от SatanaXIII Посмотреть сообщение
пока вам не потребуются указатели, трудно будет вам объяснить зачем они нужны,
Наверное один из самых элементарных случаев использования указателей - работа с элементами массива.
Имя массива есть указатель на первый элемент массива.
C++
1
2
3
int a[10]; // массив из 10 целых
*a = 42; // записать в первый элемент число 42
// a[0] = 42; // то же самое
Инкремент указателя смещает его на следующий элемент:
C++
1
2
3
int* p = a; // указатель на начало массива
p++; // смещаем указатель вперед
*p = 123; // записали 123 во второй элемент массива
В общем случае получить доступ к i-ому элементу можно так (записи равноценны):
C++
1
2
a[i];
*(a + i);
Или даже так:
C++
1
2
*(i + a);
i[a];
Можно еще глубже рассмотреть всё это дело, но давайте как-нибудь сами
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6171 / 2900 / 283
Регистрация: 04.12.2011
Сообщений: 7,710
Записей в блоге: 3
30.07.2013, 14:30     Осмысление указателей #15
Putney88, не восхищались, а пытались объяснить, что указатель это переменная имеющая смысл как адрес для косвенного обращения к переменной определённого типа. И тип, во многом, это определяющее слово, задающее возможные операции вроде инициализации, присваивания, приведение к типу и пр. Но если говорить о свойствах типов, даже не затрагивая пользовательские, - можно написать книжку. А есть еще вопросы связанные с видимостью и временем жизни переменной, определяющие возможность таких операций как взятие адреса...
Цитата Сообщение от Putney88 Посмотреть сообщение
Займусь динамическими массивами
Вот это правильно. Только оставьте динамические массивы char на потом. Посмотрите как всё работает с типом int по подробнее.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5548 / 2562 / 233
Регистрация: 01.11.2011
Сообщений: 6,333
Завершенные тесты: 1
30.07.2013, 14:42     Осмысление указателей #16
Цитата Сообщение от Tulosba Посмотреть сообщение
Наверное один из самых элементарных случаев использования указателей - работа с элементами массива.
Я бы вот здесь поправил - с динамическими. Потому как работа со статическими массивами гораздо нагляднее посредством индексов-переменных.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
30.07.2013, 14:48     Осмысление указателей #17
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Я бы вот здесь поправил - с динамическими. Потому как работа со статическими массивами гораздо нагляднее посредством индексов-переменных.
Работа с любыми массивами нагляднее через индексацию. Но раз уж ТСу интересны указатели, то разницы в том, какой массив будет использоваться, не вижу вообще.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6171 / 2900 / 283
Регистрация: 04.12.2011
Сообщений: 7,710
Записей в блоге: 3
30.07.2013, 15:23     Осмысление указателей #18
Цитата Сообщение от Tulosba Посмотреть сообщение
Работа с любыми массивами нагляднее через индексацию. Но раз уж ТСу интересны указатели, то разницы в том, какой массив будет использоваться, не вижу вообще.
Можно бы начать с выделения памяти под одиночную динамическую переменную (сразу после экспериментов со стековыми переменными)). Тогда выделение памяти, инициализация указателя и освобождение памяти складывают какую-то картину. А потом, - динамические массивы.
С другой стороны массив на стеке - хорошее начало для самого первого шага. Как пример косвенного обращения.
три целых переменных на стеке:
C++
1
2
3
4
5
6
int a = 1;//объявили по имени и инициализировали
int b = 2;//
int c = 3;//
cout << a << " ";//обратились по имени
cout << b << " ";//
cout << c << " ";//
массив из трёх целых на стеке:
C++
1
2
3
4
5
6
int Arr[] = {1, 2, 3};//объявили по имени массив - непрерывную область,
// где память под элементы занята последовательно и инициализировали её
cout << Arr[0] << " ";//обратились по имени массива (косвенному признаку группы)
// и индексу (прямой координате в группе) 
cout << Arr[1]  << " ";//
cout << Arr[2]  << " ";//
массив из трёх целых на стеке с доступом через указатель:
C++
1
2
3
4
5
6
7
8
9
10
11
12
int Arr[] = {1, 2, 3};//объявили по имени массив - непрерывную область,
// где память под элементы занята последовательно
int *ptr_Arr = 0;//объявили указатель на целое
ptr_Arr = &Arr[0];//присвоили адрес первого элемента в массиве 
cout << ptr_Arr << " ";//обратились по имени указателя к значению указателя
// выводится 16-ричный адрес первого элемента
cout << (ptr_Arr+1)  << " ";//
cout << (ptr_Arr+2)  << " ";//
 
cout << *ptr_Arr <<" ";//обратились по разименованному имени указателя, то есть по хранимому в нём адресу к значению первого элемента
cout << *(ptr_Arr+1)  << " ";//
cout << *(ptr_Arr+2)  << " ";//
Putney88
0 / 0 / 0
Регистрация: 29.07.2013
Сообщений: 20
30.07.2013, 20:01  [ТС]     Осмысление указателей #19
Премного благодарен!

Добавлено через 2 часа 51 минуту
Но, к сожалению на этом не остановимся..

Исходник:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include<conio.h>
#include<iostream>
using namespace std;
int main(int argc, char* argv[])
{
int arr[10];
int *a;
*a=arr[0];
cout<<arr[0];
getch();
        return 0;
}
Ошибка в отдельном окне :
"Project Project2.exe raised exception class EAccessViolation with message 'Access violation at address 00401174. Write of address 00000001'. Process stopped. Use Step or Run to continue."

Синяя полоска покрывает данную строку :
C++
1
int *a;
Выручайте..
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2013, 20:05     Осмысление указателей
Еще ссылки по теме:

C++ Массив указателей
C++ Инициализация указателей
Копирование указателей C++

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.07.2013, 20:05     Осмысление указателей #20
Указатель неинициализирован. *a - какое у него содержимое по адресу?
Yandex
Объявления
30.07.2013, 20:05     Осмысление указателей
Ответ Создать тему
Опции темы

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