Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
2 / 2 / 1
Регистрация: 14.09.2012
Сообщений: 83
1

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

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

Author24 — интернет-сервис помощи студентам
Начал изучать С++
и тут наткнулся на недопонимание.

Операция 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;
Объясните пожалуйста, как без выделения места в куче я могу оперировать указателем, записывая в него?????
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.03.2013, 23:11
Ответы с готовыми решениями:

Зачем нужны все эти указатели (или не указатели)
Зачем надо DWORD, HANDLE, LPVOID?

Ох уж эти указатели
Есть С++ библиотека int CCDTitanFUnctions::GetFrame(float exduration) { if (hCam == NULL)...

Выполнить обмен значениями двух переменных используя указатели на эти переменные
Выполнить обмен значениями двух переменных используя указатели на эти переменные.

Опять эти указатели
Здравствуйте! Какие не понятные явления происходят после удаления объекта P (вылетает ошибка в...

47
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
30.03.2013, 23:59 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от Pinokio Посмотреть сообщение
Т.е. я могу инициализировать ее или при помощи new или присвоив ей адрес другой переменной?
Именно так.

Добавлено через 11 секунд
Цитата Сообщение от Pinokio Посмотреть сообщение
но то что написано на С на сколько я знаю, всегда выполняется на С++. разве нет?!
не всегда
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
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.
0
2 / 2 / 1
Регистрация: 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;
0
5498 / 4893 / 831
Регистрация: 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);
}
Такое как раз отработает. С предупреждением, но отработает.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
31.03.2013, 00:11 25
Цитата Сообщение от Pinokio Посмотреть сообщение
но то что написано на С на сколько я знаю, всегда выполняется на С++. разве нет?!
Код, который корректен для С, но не для С++:
C
1
void main() {}
0
Croessmah
31.03.2013, 00:12
  #26

Не по теме:

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

0
5498 / 4893 / 831
Регистрация: 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;
Если так, то и не откомпилируется...
1
Tulosba
31.03.2013, 00:32
  #28

Не по теме:

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

0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
31.03.2013, 00:34 29
Цитата Сообщение от Tulosba Посмотреть сообщение

Не по теме:


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

Я этого не вижу...
Вот это:
C++
1
int* p = 123;
0
2 / 2 / 1
Регистрация: 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;
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
31.03.2013, 01:00 31
Вот это не компилируется!!!
C++
1
int* p = 123;
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
31.03.2013, 01:00 32
Цитата Сообщение от Pinokio Посмотреть сообщение
то он выведет 123
с чего Вы взяли, что он выведет 123?
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
31.03.2013, 01:03 33
Если это хотите написать:
C++
1
2
3
int *p;
*p = 123;
std::cout << *p;
то так и пишите.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
31.03.2013, 01:04 34
Цитата Сообщение от alsav22 Посмотреть сообщение
то так и пишите.
почти эквивалент первому:
Цитата Сообщение от Pinokio Посмотреть сообщение
C++
1
2
3
float* pf;
*pf = 3.14;
cout << *pf << endl;
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
31.03.2013, 01:08 35
Цитата Сообщение от Croessmah Посмотреть сообщение
с чего Вы взяли, что он выведет 123?
Код из 33 поста, Code::Blocks (mingv) выведет 123, если Release, в Debug - ошибка.

Не по теме:

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

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

Не по теме:

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

0
Croessmah
31.03.2013, 01:25
  #37

Не по теме:

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

0
2 / 2 / 1
Регистрация: 14.09.2012
Сообщений: 83
31.03.2013, 01:32  [ТС] 38
Цитата Сообщение от alsav22 Посмотреть сообщение
Если это хотите написать:
C++
1
2
3
int *p;
*p = 123;
std::cout << *p;
то так и пишите.
я о том, что выведет 123 тока потому что это мусор????? ведь мы же получается не инициализировали? как выше было сказано, инициализация происходит если мы использовали new или присвоили адрес другой переменной
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 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 тока потому что это мусор?
Скорее всего компилятор просто вырезает Ваш указатель из программы, так как в нем нет смысла.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
31.03.2013, 01:38 40
Цитата Сообщение от Pinokio Посмотреть сообщение
я о том, что выведет 123 тока потому что это мусор?????
Мусор не 123, а адрес, который в указателе.
0
31.03.2013, 01:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.03.2013, 01:38
Помогаю со студенческими работами здесь

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

С клавиатуры вводятся количество чисел N и сами эти числа. Разработайте приложение, которое помещает эти элеме
Помогите пожалуйста! С клавиатуры вводятся количество чисел N и сами эти числа. Разработайте...

С клавиатуры вводятся количество чисел N и сами эти числа. Разработайте приложение, которое помещает эти элементы в масс
Помогите пожалуйста написать код! С клавиатуры вводятся количество чисел N и сами эти числа....

Через указатели на указатели посчитать сумму двух чисел и записать в третье
1. Через указатели на указатели посчитать сумму двух чисел и записать в третье. 2. Написать...


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

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