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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
Pinokio
2 / 2 / 0
Регистрация: 14.09.2012
Сообщений: 83
#1

Ах, эти указатели - C++

30.03.2013, 23:11. Просмотров 1300. Ответов 47
Метки нет (Все метки)

Начал изучать С++
и тут наткнулся на недопонимание.

Операция new резервирует место в куче, необходимое для хранения значения этого типа.
т.е. правильно делать так.
C++
1
2
3
4
5
float* pf;
pf  = new float(0);
//дальше что-то делаем с переменной.
*pf = 3.14;  
cout << *pf << endl;
Тогда я не понимаю, как без new получается выполнение этого
C++
1
2
3
float* pf;
*pf = 3.14;
cout << *pf << endl;
Объясните пожалуйста, как без выделения места в куче я могу оперировать указателем, записывая в него?????
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.03.2013, 23:11
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ах, эти указатели (C++):

Ох уж эти указатели - C++
Есть С++ библиотека int CCDTitanFUnctions::GetFrame(float exduration) { if (hCam == NULL) return 1; // Don't switch...

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
31.03.2013, 01:00 #31
Вот это не компилируется!!!
C++
1
int* p = 123;
Croessmah
Модератор
Эксперт CЭксперт С++
13155 / 7418 / 831
Регистрация: 27.09.2012
Сообщений: 18,256
Записей в блоге: 3
Завершенные тесты: 1
31.03.2013, 01:00 #32
Цитата Сообщение от Pinokio Посмотреть сообщение
то он выведет 123
с чего Вы взяли, что он выведет 123?
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
31.03.2013, 01:03 #33
Если это хотите написать:
C++
1
2
3
int *p;
*p = 123;
std::cout << *p;
то так и пишите.
Croessmah
Модератор
Эксперт CЭксперт С++
13155 / 7418 / 831
Регистрация: 27.09.2012
Сообщений: 18,256
Записей в блоге: 3
Завершенные тесты: 1
31.03.2013, 01:04 #34
Цитата Сообщение от alsav22 Посмотреть сообщение
то так и пишите.
почти эквивалент первому:
Цитата Сообщение от Pinokio Посмотреть сообщение
C++
1
2
3
float* pf;
*pf = 3.14;
cout << *pf << endl;
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
31.03.2013, 01:08 #35
Цитата Сообщение от Croessmah Посмотреть сообщение
с чего Вы взяли, что он выведет 123?
Код из 33 поста, Code::Blocks (mingv) выведет 123, если Release, в Debug - ошибка.

Не по теме:

По кругу пошли...

Миниатюры
Ах, эти указатели  
alsav22
31.03.2013, 01:09
  #36

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
почти эквивалент первому:
По кругу пошли...

Croessmah
31.03.2013, 01:25
  #37

Не по теме:

Цитата Сообщение от alsav22 Посмотреть сообщение
выведет 123, если Release
В Release может вообще не быть указателя.

Pinokio
2 / 2 / 0
Регистрация: 14.09.2012
Сообщений: 83
31.03.2013, 01:32  [ТС] #38
Цитата Сообщение от alsav22 Посмотреть сообщение
Если это хотите написать:
C++
1
2
3
int *p;
*p = 123;
std::cout << *p;
то так и пишите.
я о том, что выведет 123 тока потому что это мусор????? ведь мы же получается не инициализировали? как выше было сказано, инициализация происходит если мы использовали new или присвоили адрес другой переменной
Croessmah
Модератор
Эксперт CЭксперт С++
13155 / 7418 / 831
Регистрация: 27.09.2012
Сообщений: 18,256
Записей в блоге: 3
Завершенные тесты: 1
31.03.2013, 01:37 #39

Не по теме:

Кликните здесь для просмотра всего текста
Цитата Сообщение от alsav22 Посмотреть сообщение
Code::Blocks (mingv) выведет 123, если Release
C++
1
2
3
4
5
6
#include <iostream>
int main(){
    volatile int *p;
    *p = 123;
    std::cout << *p;
}
попробовал на MinGW с ключом -O1
программа упала при запуске.



Цитата Сообщение от Pinokio Посмотреть сообщение
что выведет 123 тока потому что это мусор?
Скорее всего компилятор просто вырезает Ваш указатель из программы, так как в нем нет смысла.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
31.03.2013, 01:38 #40
Цитата Сообщение от Pinokio Посмотреть сообщение
я о том, что выведет 123 тока потому что это мусор?????
Мусор не 123, а адрес, который в указателе.
Croessmah
Модератор
Эксперт CЭксперт С++
13155 / 7418 / 831
Регистрация: 27.09.2012
Сообщений: 18,256
Записей в блоге: 3
Завершенные тесты: 1
31.03.2013, 01:39 #41
попробуйте такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
int main(){
    int *p;
    int x;
    std::cout<<"Enter x->";
    std::cin>>x;
    if(x>0)
        *p=123;
    else
        *p=45;
    std::cout << *p;
}
Тут неизвестно конечное значение вывода, поэтому компилятор вряд ли его вырежет
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
31.03.2013, 01:45 #42
Цитата Сообщение от Croessmah Посмотреть сообщение
попробовал на MinGW с ключом -O1
программа упала при запуске.
Верю. Скрин в 35 посте. Но это не важно. Что-то выводит, что-то не выводит, суть от этого не меняется.

Добавлено через 4 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
Тут неизвестно конечное значение вывода, поэтому компилятор вряд ли его вырежет
Ошибка.
Croessmah
31.03.2013, 01:48
  #43

Не по теме:

Цитата Сообщение от alsav22 Посмотреть сообщение
Ошибка.
С ключом -O3 не падает, вот гадость

Pinokio
2 / 2 / 0
Регистрация: 14.09.2012
Сообщений: 83
31.03.2013, 02:03  [ТС] #44
Цитата Сообщение от alsav22 Посмотреть сообщение
Мусор не 123, а адрес, который в указателе.
тогда как он вывел 123? почему оно сохранилось в переменной память под которую мы не выделили?(мы же не использовали new)
Croessmah
Модератор
Эксперт CЭксперт С++
13155 / 7418 / 831
Регистрация: 27.09.2012
Сообщений: 18,256
Записей в блоге: 3
Завершенные тесты: 1
31.03.2013, 02:05 #45
Цитата Сообщение от Pinokio Посмотреть сообщение
тогда как он вывел 123?
Вам же объясняют, что компилятор просто вырезал Ваш указатель при оптимизации. Ведь он не нужен никому.

Не по теме:

Цитата Сообщение от alsav22 Посмотреть сообщение
Ошибка.
Однако, с
C++
1
volatile int *p;
и с O3 падает, во всяком случае у меня

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.03.2013, 02:05
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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