С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 29.07.2013
Сообщений: 20
1

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

29.07.2013, 01:35. Показов 1574. Ответов 26
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пожалуйста расскажите более популярным языком что это такое и для чего они нужны. Перечитал несколько раз пару дополнительных источников - не могу понять как они эффективно реализуются на деле..
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.07.2013, 01:35
Ответы с готовыми решениями:

Почему в сортировке указателей на объекты в вызове функции используются адреса объектов, а не указателей?
Доброго времени суток! Рассматриваю пример (из Лафоре) сортировки массива указателей на объекты,...

Создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей
Задача: создать специфицированный шаблон функции, принимающей массив указателей на char и...

Объяснить различия в работе указателей на целое число и указателей на const char (строки в стиле Си)
Уважаемые программисты, возникло несколько вопросов касательно указателей. Почему при выводе...

Создать специализацию для шаблона, которая принимает массив указателей на строки и количество этих указателей
Нужно создать специализацию для шаблона, которая принимает массив указателей на строки и количество...

26
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
29.07.2013, 01:38 2
Книги пересказывать? Что конкретно непонятно?
0
What a waste!
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
29.07.2013, 02:54 3
Цитата Сообщение от Putney88 Посмотреть сообщение
для чего они нужны.
Адреса переменных определённого типа хранить
1
78 / 60 / 9
Регистрация: 26.06.2013
Сообщений: 198
29.07.2013, 07:45 4
Ну, бывает, что и не совсем определенных типов. И не только переменых.
1
840 / 478 / 58
Регистрация: 18.09.2012
Сообщений: 1,688
29.07.2013, 09:57 5
Putney88, если честно на на тему "Эффективное использование указателей", "Как ими пользоваться" и т.д. по списку, можно курсачи писать. Очень трудно всё рассказать, где, зачем, почему и.т.д. Понимание приходит с опытом, написанием программ, чтение чужих кодов, и чтение литературы.
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
29.07.2013, 10:10 6
Putney88, допустим, есть некая сущность (переменная, функция ... ), указатель - это, в общем, адрес этой сущности.
1
0 / 0 / 0
Регистрация: 29.07.2013
Сообщений: 20
30.07.2013, 13:30  [ТС] 7
Хорошо, поставим вопрос иначе.
Для меня указатели равносильны операции присваиаания, так ли это?
И уже новый образовавшийся вопрос : с чего лучше начать практику с указателями.
Учусь по Шилдту. 3 базовый курс, усвоил циклы, массивы и все что было вплоть до указателей, иными словами зашел в тупик.
0
840 / 478 / 58
Регистрация: 18.09.2012
Сообщений: 1,688
30.07.2013, 13:34 8
Указатели это тип переменное, а присваивание это операция. Как они могут быть равносильны?

Добавлено через 1 минуту
Цитата Сообщение от Putney88 Посмотреть сообщение
уже новый образовавшийся вопрос : с чего лучше начать практику с указателями.
Да с самого элементарного. Операция разыменования, отличие ссылок и указателей, присваивание указателей, взятие адреса. Потом динамические массивы и т.д...
1
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
30.07.2013, 13:34 9
Цитата Сообщение от Putney88 Посмотреть сообщение
Для меня указатели равносильны операции присваиаания, так ли это?
что за бред?
указатель - это сущность - адрес - число.
а операция это операция - это действие.
1
Почетный модератор
Эксперт С++
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
30.07.2013, 13:39 10
Цитата Сообщение от Jupiter Посмотреть сообщение
что за бред?
Наверное имелось в виду, что через указатели можно присвоить значение переменной, на которую они указывают.
1
0 / 0 / 0
Регистрация: 29.07.2013
Сообщений: 20
30.07.2013, 13:58  [ТС] 11
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Наверное имелось в виду, что через указатели можно присвоить значение переменной, на которую они указывают.
Да, я пытался это и сказать.
В теории я смотрю на это как на две одинаковые вещи.. не могу уловить различие..
Одно присваивает ячейку памяти другогой переменной.
Другое просто передает значение.
Извините за глупую наивность, я стараюсь это исправить..
0
Почетный модератор
Эксперт С++
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
30.07.2013, 14:09 12
Putney88, пока вам не потребуются указатели, трудно будет вам объяснить зачем они нужны, да и все свистелки, которые можно с ними зачудить. А главное зачем это вообще все нужно. Пользуйтесь пока знакомыми вам переменными, и потихоньку начните разбираться с динамическими массивами - для первого примера.
1
0 / 0 / 0
Регистрация: 29.07.2013
Сообщений: 20
30.07.2013, 14:16  [ТС] 13
Пока все что вы делали - только восхищались что я сравниваю несравнимое.
Займусь динамическими массивами.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
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];
Можно еще глубже рассмотреть всё это дело, но давайте как-нибудь сами
2
Комп_Оратор)
Эксперт по математике/физике
8950 / 4704 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
30.07.2013, 14:30 15
Putney88, не восхищались, а пытались объяснить, что указатель это переменная имеющая смысл как адрес для косвенного обращения к переменной определённого типа. И тип, во многом, это определяющее слово, задающее возможные операции вроде инициализации, присваивания, приведение к типу и пр. Но если говорить о свойствах типов, даже не затрагивая пользовательские, - можно написать книжку. А есть еще вопросы связанные с видимостью и временем жизни переменной, определяющие возможность таких операций как взятие адреса...
Цитата Сообщение от Putney88 Посмотреть сообщение
Займусь динамическими массивами
Вот это правильно. Только оставьте динамические массивы char на потом. Посмотрите как всё работает с типом int по подробнее.
1
Почетный модератор
Эксперт С++
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
30.07.2013, 14:42 16
Цитата Сообщение от Tulosba Посмотреть сообщение
Наверное один из самых элементарных случаев использования указателей - работа с элементами массива.
Я бы вот здесь поправил - с динамическими. Потому как работа со статическими массивами гораздо нагляднее посредством индексов-переменных.
2
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
30.07.2013, 14:48 17
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Я бы вот здесь поправил - с динамическими. Потому как работа со статическими массивами гораздо нагляднее посредством индексов-переменных.
Работа с любыми массивами нагляднее через индексацию. Но раз уж ТСу интересны указатели, то разницы в том, какой массив будет использоваться, не вижу вообще.
1
Комп_Оратор)
Эксперт по математике/физике
8950 / 4704 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
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)  << " ";//
1
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;
Выручайте..
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
30.07.2013, 20:05 20
Указатель неинициализирован. *a - какое у него содержимое по адресу?
1
30.07.2013, 20:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.07.2013, 20:05
Помогаю со студенческими работами здесь

Как обойтись без указателей и указателей на указатель?
Ибо не совсем выходит понять,что на что тут указывает #include &quot;stdafx.h&quot; #include &lt;iostream&gt;...

Различия указателей char* от указателей других типов
Помогите пожалуйста разобраться! Прочитал раздел про указатели и даже вроде бы понял. Что...

Создание массивов указателей на массивы указателей
Помогите в решении задачи: создал массив указателей на массивы указателей на строки, но компилятор...

Добавление нового указателя в конец массива указателей, удаление указанного элемента, добавление указателей
Здравствуйте. Помогите, пожалуйста, разобраться с одним большим заданием. Задание пока в процессе...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru