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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.67
lepufuxa
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 6
#1

Что такое int* - C++

23.01.2013, 15:44. Просмотров 3256. Ответов 21
Метки нет (Все метки)

Если с этим
C++
1
int a=3,*p = &a;
понятно, то есть переменная "p" содержит адресс переменной "a" и указывает на тип int, то с этим не очень понятно
C++
1
int* f(){int x=2;return &x}
Что происходит в случаее с функцией? Где содержится адресс переменной "x", который возвращает иструкция "return &x"? Ведь есть только "int*, а адресс где хранить? Я что-то упускаю, но не пойму.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.01.2013, 15:44
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Что такое int* (C++):

Что это такое int (*func4 (void)(int) - C++
Это примеры указателей на функцию. Понятно.void (*func1) (void *, int *); void (*func2) (int, int *); void (*func3) (void); А это что...

Что такое int*a ? - C++
С++ что такое int*a ??? заранее спс

что такое возможности типа Int? - C++
Здравствуйте, хм глупый вопрос скажите пожалуйста все возможности типа int языка с++:pardon:

Что значит такое объявление typedef int (*A) ( )? - C++
typedef int (*A) ( ) Как его понять? Есть варианты ответа А. Объявление типа, что являет показатель за переменную типа int Б....

что такое int argc, char *argv[] в качестве параметров главной (main) функции? - C++
И зачем

Что такое "volatile int" - C++
есть объявление и инициализация переменной: volatile int Sklad = 0; что такое "volatile"? с msdn не очень понял, кто сможет...

21
UserAK
73 / 73 / 4
Регистрация: 25.12.2012
Сообщений: 189
Записей в блоге: 2
23.01.2013, 15:49 #2
Цитата Сообщение от lepufuxa Посмотреть сообщение
int* f(){int x=2;return &p}
а что такое р ?

Добавлено через 2 минуты
а понял, это переменная типа int глобальная или может член класса-владельца функции
0
lepufuxa
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 6
23.01.2013, 15:53  [ТС] #3
UserAK, приношу извинения, я писал сообщение побольше этого, но когда нажал отправить, то выкинуло из акаунта, а когда вошел, то выскочила ошибка форума, что я использваол русские и английские слвоа месте, а когда нажал под ошибкой на кнопку назад, то в сообщение не возвращалось, а шла переадресация на эту ошибку, ну а вернутся на само написание сообщения в браузере через стрелочки назад, не смог, так как в ie9 почему то не сохраняется буфер сообщений, которые были на предыдущих страницах открытых в барузере в той же вкладке в отлчии от google chrome. Ну а когда вошел и начал писать заного, то каким то хоткеем случайно создал преждевременно тему. Ну и начал побыстрому редактировать хоть что-то.
0
UserAK
73 / 73 / 4
Регистрация: 25.12.2012
Сообщений: 189
Записей в блоге: 2
23.01.2013, 15:53 #4
x - локальная стековая переменная, и она уничтожается после выхода из функции, т.е. адрес указывает не известно на что
0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
23.01.2013, 15:58 #5
Цитата Сообщение от lepufuxa Посмотреть сообщение
Что происходит в случаее с функцией? Где содержится адресс переменной "x", который возвращает иструкция "return &x"?
Нельзя возвращать адреса локальных объектов.
0
UserAK
73 / 73 / 4
Регистрация: 25.12.2012
Сообщений: 189
Записей в блоге: 2
23.01.2013, 15:58 #6
Цитата Сообщение от lepufuxa Посмотреть сообщение
int* f(){int x=2;return &x}
если хотите, что бы переменная была доступна после выхода из функции, то разместите её в куче, а не в стеке:
C++
1
int* f(){int *x=new int(2);return x;}
0
ZaMaZaN4iK
Мой лучший друг-отладчик!
164 / 164 / 9
Регистрация: 24.06.2012
Сообщений: 662
Записей в блоге: 5
Завершенные тесты: 1
23.01.2013, 16:04 #7
lepufuxa, int * в обьявлении на функции указывает нам на то, что функция f возвращает указатель на int.У вас возвращается адрес локальной переменной., которая после выхода из функции уничтожается.Значит указатель будет указывать на ни на что.И если вы потом попытаетесь менять по этому указателю переменную, вам выкинет ошибку.
1
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
23.01.2013, 16:08 #8
Цитата Сообщение от ZaMaZaN4iK Посмотреть сообщение
которая после выхода из функции уничтожается.
"освобождается"
Цитата Сообщение от ZaMaZaN4iK Посмотреть сообщение
Значит указатель будет указывать на ни на что.
на тот же участок памяти и если он не перезаписан еще, то там будет значение x, но надеяться на это не очень хорошо.
0
lepufuxa
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 6
23.01.2013, 20:22  [ТС] #9
Этот код был для примера и то что после выхода освобождается понятно. Я имел ввиду каким образом и в каком виде это передается, то есть что и куда будет передаватся через инструкцию return. Ну вот если бы у функции был возвращаемый тип int без указателя, то при вызове функции вернулось бы какое-то число, а если тип с указателем, то return передает адресс, но а что дальше происходит с этим адрессом? Лучше на примере копирования массива через operator=
0
MrGluck
Модератор
Эксперт CЭксперт С++
7488 / 4603 / 691
Регистрация: 29.11.2010
Сообщений: 12,589
23.01.2013, 21:13 #10
Цитата Сообщение от UserAK Посмотреть сообщение
если хотите, что бы переменная была доступна после выхода из функции, то разместите её в куче, а не в стеке:
C++
1
int* f(){int *x=new int(2);return x;}
ага, и не забудьте потом освободить. А ведь наверняка где-нибудь, да программист с руками с одного места, или просто рассеянный, забудет так сделать. Избегайте выделения памяти в куче внутри функции т.к. понадеяться, на то, что программист знает функцию и что он не забудет освободить память просто нельзя (а это лишь в этой программе одна функция, а представьте, что будет в проекте?) Нет, так делать нельзя.
0
lepufuxa
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 6
23.01.2013, 22:01  [ТС] #11
MrGluck, страно это слышать от человека с 717 плюсами в репутации
0
Kuzia domovenok
1947 / 1800 / 137
Регистрация: 25.03.2012
Сообщений: 6,238
Записей в блоге: 1
23.01.2013, 22:20 #12
Цитата Сообщение от lepufuxa Посмотреть сообщение
MrGluck, страно это слышать от человека с 717 плюсами в репутации
а я наоборот плюсану. Если есть такая возможность, то пусть функция принимает в качестве аргумента указатель на выделенную память, в которую будет записывать то, что собирается вернуть.
C++
1
2
3
4
5
6
7
8
9
void fill(int* buffer, int size){
  /// так лучше, чем...
}
 
int* fill(int size){
  int* buffer=new int[size];
  ///...чем так
  return buffer;
}
тот кто вызывает функцию лучше знает, когда и каким образом выделять память,
а когда и каким образом освобождать.
может память внутри функции выделялась через malloc??? А может предоставлялась каким-нибудь менеджером памяти? Как я буду гадать, как её освободить, не вникая в тело функции fill?
0
lepufuxa
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 6
23.01.2013, 22:35  [ТС] #13
Kuzia domovenok, я же не спорю, но это так категорично звучало, что даже множество больших объектов выделяемых внутри функции, должны были сказать "okay" и начать крашить стек. И безрукость или невнимательность программистов - это не аргумент для отказа от использования кучи внутри функций, так как вся эта "безрукость и невнимательность" - как минимум нежелание в чем либо разбиратся, что может вызвать куда больше проблем, чем шанс не уследить за утечкой памяти. Вообщем, это все оффтоп. На главный вопрос тут так и не ответили, а начали искать что-то в коде, который был для примера.
0
ValeryS
Модератор
6705 / 5114 / 482
Регистрация: 14.02.2011
Сообщений: 17,183
23.01.2013, 22:56 #14
Цитата Сообщение от ZaMaZaN4iK Посмотреть сообщение
У вас возвращается адрес локальной переменной., которая после выхода из функции уничтожается.
фиг вам
она остается в памяти никто её специально уничтожать не собирается
просто память получает статус свободной и любая стерлядь может туда записать что угодно
но указатель то валидный а значения могут быть любые
Цитата Сообщение от Croessmah Посмотреть сообщение
"освобождается"
вот это правильней ибо сам БиллГейтс не сможет гарантировать что в этой памяти лежит
но если знать эти подводные камни можно написать програмки которые будут работать

Добавлено через 9 минут
Цитата Сообщение от lepufuxa Посмотреть сообщение
о это так категорично звучало, что даже множество больших объектов выделяемых внутри функции, должны были сказать "okay" и начать крашить стек.
а что так не бывает?
выдели на стеке массив на миллиард интов

Цитата Сообщение от lepufuxa Посмотреть сообщение
И безрукость или невнимательность программистов - это не аргумент для отказа от использования кучи внутри функций,
А кто то предлагал отказаться

Цитата Сообщение от lepufuxa Посмотреть сообщение
как минимум нежелание в чем либо разбиратся, что может вызвать куда больше проблем, чем шанс не уследить за утечкой памяти.
Представь что тебе дали либу, которую написал горе-программист и не документировал
там такая функция
C++
1
myClass* MyGet();
и как ты разберешься что вернули указатель на действующий класс или выделили память с нуля
удалять или нет ??
0
lepufuxa
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 6
23.01.2013, 23:27  [ТС] #15
Цитата Сообщение от ValeryS Посмотреть сообщение
а что так не бывает?
выдели на стеке массив на миллиард интов
Ну так это был сарказм...

Цитата Сообщение от ValeryS Посмотреть сообщение
а что так не бывает?
выдели на стеке массив на миллиард интов
Просто выделить? Ой лол.
Цитата Сообщение от ValeryS Посмотреть сообщение
А кто то предлагал отказаться
Да, соглашайся.

Цитата Сообщение от ValeryS Посмотреть сообщение
и как ты разберешься что вернули указатель на действующий класс или выделили память с нуля
удалять или нет ??
Так получается, что "горе-программист" не только написал либу, а ещё и дал её?
0
23.01.2013, 23:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.01.2013, 23:27
Привет! Вот еще темы с ответами:

Что такое файловый буфер? Что такое режим (модификатор) доступа, при работе с файлами? - C++
Что такое файловый буфер? Что такое режим (модификатор) доступа, при работе с файлами?

Что такое рекурсивный тип данных? Что такое конструкция рекурсивного типа? - C++
Что такое рекурсивный тип данных? Что такое конструкция рекурсивного типа?

Что такое хэндлер файла? Что такое файловый указатель? - C++
Что такое хэндлер файла? Что такое файловый указатель?

Что такое заголовочный файл? Что такое файл исходного кода? Рассмотрите назначение каждого из них - C++
Что такое заголовочный файл? Что такое файл исходного кода? Рассмотрите назначение каждого из них пожалуйста.


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

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

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