Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 27, средняя оценка - 4.63
Hagrael
БТР - мой друг
331 / 273 / 2
Регистрация: 07.01.2010
Сообщений: 1,932
#1

Указатели - C++

23.06.2011, 20:08. Просмотров 3567. Ответов 54
Метки нет (Все метки)

1) Указатель можно инициализирвоать только с помощью операции *p=&a? А как записать адрес переменной в простую переменную (я пытался это делать через операцию b=&a, но компилятор ругается, говорит, что операция &a возвращает указатель.
2) Почему имеет значение тип указателя? Ведь это просто ссылка на переменную.

И еще один вопрос, не касающийся указателей:
3) Как программа узнает, какие места ОЗУ ей можно занимать (не заняты др. программой), а какие - нет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.06.2011, 20:08
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Указатели (C++):

Указатели и указатели на указатели, а также типы данных - C++
Недавно начал изучать Си, перешел с Delphi. Много непонятного и пока процесс идет медленно. Накачал литературы, буду изучать) Щас...

Через указатели на указатели посчитать сумму двух чисел и записать в третье - C++
1. Через указатели на указатели посчитать сумму двух чисел и записать в третье. 2. Написать примитивный калькулятор, пользуясь только...

Есть три переменные. Используя указатели на указатели, поменять значение максимальной и минимальной переменной - C++
Мой код. #include <iostream> #include <stdlib.h> #include<iomanip> using namespace std; void min_max(int*pa, int*pb,...

Указатели на указатели с числами. Почему можно присвоить число в 4-ый элемент, если массив из 2 элементов? - C++
Есть массив int **mas; mas=new int*; // выделил место под пять строк, верно ? mas=new int;// выделил для первой строки матрицы два...

Отсортировать массив и вывести на экран (массивы и указатели на указатели) - C++
Даны массивы F-фамилий студентов и S-результаты сессии (5 оценок) , причем s- результат сессии F студента. Отсортировать массив S по...

Указатели на слонов или А зачем нужны указатели? - C++
Знаю что таких вопросов было уйма, но я так и не нашел ответа на свой вопрос. Для чего нужны указатели? Что такое указатели я знаю, это...

54
pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
25.06.2011, 20:54 #46
Цитата Сообщение от Hagrael Посмотреть сообщение
Но вопросы еще остались. Ядро ОС - это ОЗУ, как я понимаю?
почитай Таненбаума "Современные операционные системы" ну или как то так название и все вопросы отпадут. А то вопросы и выводы у тебя мягко говоря странные, например как это
Цитата Сообщение от Hagrael Посмотреть сообщение
Но ведь (повторюсь) возвращаемое значение имеет тип type* - тип указателя, а следовательно, это не адрес (простое число), а указатель!
по пути ещё ассемблер освой, непонимание основ подводит тебя и из-за этого ты какую то фигню размусолил аж на пять страниц
0
Hagrael
БТР - мой друг
331 / 273 / 2
Регистрация: 07.01.2010
Сообщений: 1,932
25.06.2011, 20:57  [ТС] #47
pito211, позже я доберусь и до ассемблера, однако пока хочется узнать механизмы.
0
pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
25.06.2011, 21:11 #48
да уже сто раз тут все механизмы обсудили, указатели разжевали как только могли, а ты до сих пор задаёшь одни и те же вопросы. Про виртуальную память всё подробно расписано в книге, которую я привёл выше. Может лучше её открыть, а не дёргать других людей по пустякам, уж наверно у них есть дела поважнее, чем цитирование литературы, находящейся в свободном доступе? Накрайняк можно в педивикию заглянуть

Добавлено через 4 минуты
Цитата Сообщение от pito211 Посмотреть сообщение
да уже сто раз тут все механизмы обсудили, указатели разжевали как только могли
и если ты не понял чего то про указатели, то это целиком из-за пробелов в знаниях. Значит тут два варианта - заполнить пробелы или оставить как есть

Добавлено через 1 минуту
Цитата Сообщение от Hagrael Посмотреть сообщение
3) Как программа узнает, какие места ОЗУ ей можно занимать (не заняты др. программой), а какие - нет.
на этот вопрос в книге таненбаума целая глава есть ВАП
1
Hagrael
БТР - мой друг
331 / 273 / 2
Регистрация: 07.01.2010
Сообщений: 1,932
25.06.2011, 21:14  [ТС] #49
pito211, в моей книге этих нюансов не описывается, а главу "Указатели" я полностью прошел. Я не заставляю никого помогать и не испытываю злобу на людей этого форума, которые мне не помогают Но будьте добры, не заводите впредь эту тему, если конкретную литературу вы не посоветуете. А эта тема действительно будет полезна не только мне, но и другим новичкам, ведь здесь все изложено кратко.
0
ValeryLaptev
Эксперт С++
1048 / 827 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
25.06.2011, 21:23 #50
Hagrael, немного про адреса и указатели.
Память - это массив байтов. А элементы массива, как ты знаешь, ПРОНУМЕРОВАНЫ. От 0 до n-1.
В 32-битной машине этот массив имеет размер 2^32 = 4 гб.
Номер элемента памяти - это и есть адрес. Это положительное целое число. Указатель - это переменная, которая хранит этот номер-адрес. В С++ принято, что при выводе на экран значение указателя (целое число-номер элемента памяти) выводится в шестнадцатеричной системе.
1
taras atavin
3888 / 1762 / 92
Регистрация: 24.11.2009
Сообщений: 27,565
26.06.2011, 10:30 #51
Цитата Сообщение от talis Посмотреть сообщение
Ответить можно и так, и так. Один и тот же указатель может хранить адрес любого по размеру куска памяти. Потому, что единственное, что он хранит - это адрес начала этого куска.
С этим связана одна проблема:
C++
1
delee [] p;//Сколько байт здесь освобождать?
. Как решается?

Добавлено через 13 минут
Цитата Сообщение от Hagrael Посмотреть сообщение
Каждая программа думает, что она одна. Обеспечивает эту сладкую иллюзию для эгоистки-программы операционная система. Но мне не до конца понятно вот что: в коде откомпилированного файла не хранится точный адрес переменной, по которому ее надо записать. Ведь если так будет, то по этому адресу может находиться другая переменная, и возникнет конфликт.
Не будет никакого конфликта, так как по данному адресу в локальном виртуальном адресном пространстве (именно так, виртуальная память - это вообще файл на винчестере, ни какого отношения он сюда не имеет, а работает с ним единственная программа - операционная система, так что в нём как раз только физические адреса) нет других программ, чьи данные и код могли оказаться по указанному адресу. Я уже писал про отсебячьи карты, так вот, это карты разных райнонов, у каждой проги свой.
0
Hagrael
БТР - мой друг
331 / 273 / 2
Регистрация: 07.01.2010
Сообщений: 1,932
26.06.2011, 10:34  [ТС] #52
Странная вещь у меня тут возникла. Вот код:
C++
1
2
const int a=5;
const int b=a;
Без слова const перед int b код не хочет работать. Т. е. из константы в обычную переменную переводить нельзя. Однако этот код:
C++
1
2
int a[10];
int* b=a;
работает! В чем дело?
0
taras atavin
3888 / 1762 / 92
Регистрация: 24.11.2009
Сообщений: 27,565
26.06.2011, 10:35 #53
Цитата Сообщение от Hagrael Посмотреть сообщение
На этапе компиляции переменные являются указателями?
Нет. Но поля элементов таблицы - указатели.
0
Hagrael
БТР - мой друг
331 / 273 / 2
Регистрация: 07.01.2010
Сообщений: 1,932
26.06.2011, 10:36  [ТС] #54
Непонятно вообще, зачем массив делают константой.
0
Bers
Заблокирован
26.06.2011, 11:38 #55
Цитата Сообщение от taras atavin Посмотреть сообщение
С этим связана одна проблема:
C++
1
delee [] p;//Сколько байт здесь освобождать?
. Как решается?
Существует небольшая проблема:
int m[]; int * p = m; // or int * p = &m[0];
В рантайме невозможно в принципе узнать, какой тег следует приписать указателю - массив или нет.

Однако, есть безопасная функция, которая позволяет узнать сколько было заявлено при new [количество] ???

И да, кстати:

int* iPtr = new int [10];
delete [] iPtr;

Как вы видите, при удалении данных не нужно указывать явное количество.
Напрашивается вывод: реализация delete[] знает точное количество элементов.
Внимание вопрос: если нечто знает количество элементов, на кой чорт это количество дополнительно помнить?

Вопрос номер два: как узнать, какое количество элементов было выделено с помощью new[]
Варианты с шаманством над адресами не предлагать. Существует безопасная функция.

Вопрос номер три: как узнать, на какое количество элементов вообще ссылается указатель iPtr ?
У кого и как об этом можно спросить?

Главный вопрос номер четыре: Как научить клиентский код различать указатель на объект от указателя на массив?

Добавлено через 36 минут
Цитата Сообщение от Hagrael Посмотреть сообщение
Непонятно вообще, зачем массив делают константой.
см. идеологию "строгой типизации". А так же "почему истовый профессионал сыплет константами везде, где только можно".


/ps константность иногда убивает инкапсуляцию.
0
26.06.2011, 11:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.06.2011, 11:38
Привет! Вот еще темы с ответами:

Написать программу сортировки через указатели на указатели - C++
Вот моя программа #include <iostream> #include <conio.h> #include <string> using namespace std; //Сортировка "пузырьком". ...

Используются ли на практике указатели на указатели объектов? - C++
Имеются ввиду указатели именно на объекты, а не динамические массивы. Например такой: Object** obj; А как насчёт такого: Object***...

Указатели на массивы. Указатели и функции - C++
Вот задача: Даны два массива : А и B. Необходимо создать третий массив, в котором нужно собрать: -Элементы обоих массивов; -Общие...

Константные указатели и указатели на константу - C++
Чем они, собственно говоря, отличаются? Поясните, пожалуйста. Не знаю, как так получилось, что в разных источниках - разные...


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

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

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