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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
Pinokio
2 / 2 / 0
Регистрация: 14.09.2012
Сообщений: 83
30.03.2013, 23:11     Ах, эти указатели #1
Начал изучать С++
и тут наткнулся на недопонимание.

Операция 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;
Объясните пожалуйста, как без выделения места в куче я могу оперировать указателем, записывая в него?????
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,869
Записей в блоге: 2
Завершенные тесты: 1
30.03.2013, 23:59     Ах, эти указатели #21
Цитата Сообщение от Pinokio Посмотреть сообщение
Т.е. я могу инициализировать ее или при помощи new или присвоив ей адрес другой переменной?
Именно так.

Добавлено через 11 секунд
Цитата Сообщение от Pinokio Посмотреть сообщение
но то что написано на С на сколько я знаю, всегда выполняется на С++. разве нет?!
не всегда
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
31.03.2013, 00:00     Ах, эти указатели #22
Цитата Сообщение от Pinokio Посмотреть сообщение
Т.е. я могу инициализировать ее или при помощи new или присвоив ей адрес другой переменной?
Да.
C++
1
2
3
4
5
int i = 42;
int *p = &i;
std::cout << *p; // Выведет 42.
*p = 123;
std::cout << i; // Выведет 123.
Pinokio
2 / 2 / 0
Регистрация: 14.09.2012
Сообщений: 83
31.03.2013, 00:03  [ТС]     Ах, эти указатели #23
Все, Всем спасибо! теперь я понял)

Добавлено через 2 минуты
а вот если так то он выведет 123 тока потому что это мусор?
C++
1
2
3
4
/*int *p = &i;
std::cout << *p; // Выведет 42. */
int* p = 123;
std::cout << i;
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
31.03.2013, 00:09     Ах, эти указатели #24
Цитата Сообщение от Croessmah Посмотреть сообщение
В студии и такое не отработает в Debug:
C++
1
2
3
4
5
6
void foo(int x){
}
int main(){
 int x;
 foo(x);
}
Такое как раз отработает. С предупреждением, но отработает.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
31.03.2013, 00:11     Ах, эти указатели #25
Цитата Сообщение от Pinokio Посмотреть сообщение
но то что написано на С на сколько я знаю, всегда выполняется на С++. разве нет?!
Код, который корректен для С, но не для С++:
C
1
void main() {}
Croessmah
31.03.2013, 00:12
  #26

Не по теме:

Цитата Сообщение от alsav22 Посмотреть сообщение
Такое как раз отработает. С пердупреждением, но отработает.
угу
Ах, эти указатели

alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
31.03.2013, 00:30     Ах, эти указатели #27
Цитата Сообщение от Croessmah Посмотреть сообщение

Не по теме:


угу
Вложение 250318

Продолжить нажмите... Это только пердупреждение (о чём я и написал).

Добавлено через 9 минут
Цитата Сообщение от Pinokio Посмотреть сообщение
а вот если так то он выведет 123 тока потому что это мусор?
C++
1
2
3
4
/*int *p = &i;
std::cout << *p; // Выведет 42. */
int* p = 123;
std::cout << i;
Если так, то и не откомпилируется...
Tulosba
31.03.2013, 00:32
  #28

Не по теме:

Цитата Сообщение от alsav22 Посмотреть сообщение
Если так, то и не откомпилируется...
Ну там int i = 42; в нулевой строке

alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
31.03.2013, 00:34     Ах, эти указатели #29
Цитата Сообщение от Tulosba Посмотреть сообщение

Не по теме:


Ну там int i = 42; в нулевой строке

Я этого не вижу...
Вот это:
C++
1
int* p = 123;
Pinokio
2 / 2 / 0
Регистрация: 14.09.2012
Сообщений: 83
31.03.2013, 00:55  [ТС]     Ах, эти указатели #30
а вот если так то он выведет 123 тока потому что это мусор? ошибся, пропустил.
C++
1
2
3
4
/*int *p = &i;
std::cout << *p; // Выведет 42. */
int* p = 123;
std::cout << *p;
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
31.03.2013, 01:00     Ах, эти указатели #31
Вот это не компилируется!!!
C++
1
int* p = 123;
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,869
Записей в блоге: 2
Завершенные тесты: 1
31.03.2013, 01:00     Ах, эти указатели #32
Цитата Сообщение от Pinokio Посмотреть сообщение
то он выведет 123
с чего Вы взяли, что он выведет 123?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
31.03.2013, 01:03     Ах, эти указатели #33
Если это хотите написать:
C++
1
2
3
int *p;
*p = 123;
std::cout << *p;
то так и пишите.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,869
Записей в блоге: 2
Завершенные тесты: 1
31.03.2013, 01:04     Ах, эти указатели #34
Цитата Сообщение от alsav22 Посмотреть сообщение
то так и пишите.
почти эквивалент первому:
Цитата Сообщение от Pinokio Посмотреть сообщение
C++
1
2
3
float* pf;
*pf = 3.14;
cout << *pf << endl;
alsav22
5282 / 4801 / 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
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,869
Записей в блоге: 2
Завершенные тесты: 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 тока потому что это мусор?
Скорее всего компилятор просто вырезает Ваш указатель из программы, так как в нем нет смысла.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.03.2013, 01:38     Ах, эти указатели
Еще ссылки по теме:

C++ Написать программу сортировки через указатели на указатели
Указатели и массивы. Указатели и функции C++
Указатели на массивы. Указатели и функции C++

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
31.03.2013, 01:38     Ах, эти указатели #40
Цитата Сообщение от Pinokio Посмотреть сообщение
я о том, что выведет 123 тока потому что это мусор?????
Мусор не 123, а адрес, который в указателе.
Yandex
Объявления
31.03.2013, 01:38     Ах, эти указатели
Ответ Создать тему
Опции темы

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