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

Что такое int*

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

Author24 — интернет-сервис помощи студентам
Если с этим
C++
1
int a=3,*p = &a;
понятно, то есть переменная "p" содержит адресс переменной "a" и указывает на тип int, то с этим не очень понятно
C++
1
int* f(){int x=2;return &x}
Что происходит в случаее с функцией? Где содержится адресс переменной "x", который возвращает иструкция "return &x"? Ведь есть только "int*, а адресс где хранить? Я что-то упускаю, но не пойму.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.01.2013, 15:44
Ответы с готовыми решениями:

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

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

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

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

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

Добавлено через 2 минуты
а понял, это переменная типа int глобальная или может член класса-владельца функции
0
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 6
23.01.2013, 15:53  [ТС] 3
UserAK, приношу извинения, я писал сообщение побольше этого, но когда нажал отправить, то выкинуло из акаунта, а когда вошел, то выскочила ошибка форума, что я использваол русские и английские слвоа месте, а когда нажал под ошибкой на кнопку назад, то в сообщение не возвращалось, а шла переадресация на эту ошибку, ну а вернутся на само написание сообщения в браузере через стрелочки назад, не смог, так как в ie9 почему то не сохраняется буфер сообщений, которые были на предыдущих страницах открытых в барузере в той же вкладке в отлчии от google chrome. Ну а когда вошел и начал писать заного, то каким то хоткеем случайно создал преждевременно тему. Ну и начал побыстрому редактировать хоть что-то.
0
73 / 73 / 13
Регистрация: 25.12.2012
Сообщений: 189
Записей в блоге: 2
23.01.2013, 15:53 4
x - локальная стековая переменная, и она уничтожается после выхода из функции, т.е. адрес указывает не известно на что
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
23.01.2013, 15:58 5
Цитата Сообщение от lepufuxa Посмотреть сообщение
Что происходит в случаее с функцией? Где содержится адресс переменной "x", который возвращает иструкция "return &x"?
Нельзя возвращать адреса локальных объектов.
0
73 / 73 / 13
Регистрация: 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
Мой лучший друг-отладчик!
167 / 167 / 30
Регистрация: 24.06.2012
Сообщений: 662
Записей в блоге: 5
23.01.2013, 16:04 7
lepufuxa, int * в обьявлении на функции указывает нам на то, что функция f возвращает указатель на int.У вас возвращается адрес локальной переменной., которая после выхода из функции уничтожается.Значит указатель будет указывать на ни на что.И если вы потом попытаетесь менять по этому указателю переменную, вам выкинет ошибку.
1
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
23.01.2013, 16:08 8
Цитата Сообщение от ZaMaZaN4iK Посмотреть сообщение
которая после выхода из функции уничтожается.
"освобождается"
Цитата Сообщение от ZaMaZaN4iK Посмотреть сообщение
Значит указатель будет указывать на ни на что.
на тот же участок памяти и если он не перезаписан еще, то там будет значение x, но надеяться на это не очень хорошо.
0
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 6
23.01.2013, 20:22  [ТС] 9
Этот код был для примера и то что после выхода освобождается понятно. Я имел ввиду каким образом и в каком виде это передается, то есть что и куда будет передаватся через инструкцию return. Ну вот если бы у функции был возвращаемый тип int без указателя, то при вызове функции вернулось бы какое-то число, а если тип с указателем, то return передает адресс, но а что дальше происходит с этим адрессом? Лучше на примере копирования массива через operator=
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
23.01.2013, 21:13 10
Цитата Сообщение от UserAK Посмотреть сообщение
если хотите, что бы переменная была доступна после выхода из функции, то разместите её в куче, а не в стеке:
C++
1
int* f(){int *x=new int(2);return x;}
ага, и не забудьте потом освободить. А ведь наверняка где-нибудь, да программист с руками с одного места, или просто рассеянный, забудет так сделать. Избегайте выделения памяти в куче внутри функции т.к. понадеяться, на то, что программист знает функцию и что он не забудет освободить память просто нельзя (а это лишь в этой программе одна функция, а представьте, что будет в проекте?) Нет, так делать нельзя.
0
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 6
23.01.2013, 22:01  [ТС] 11
MrGluck, страно это слышать от человека с 717 плюсами в репутации
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,495
Записей в блоге: 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
0 / 0 / 0
Регистрация: 23.01.2013
Сообщений: 6
23.01.2013, 22:35  [ТС] 13
Kuzia domovenok, я же не спорю, но это так категорично звучало, что даже множество больших объектов выделяемых внутри функции, должны были сказать "okay" и начать крашить стек. И безрукость или невнимательность программистов - это не аргумент для отказа от использования кучи внутри функций, так как вся эта "безрукость и невнимательность" - как минимум нежелание в чем либо разбиратся, что может вызвать куда больше проблем, чем шанс не уследить за утечкой памяти. Вообщем, это все оффтоп. На главный вопрос тут так и не ответили, а начали искать что-то в коде, который был для примера.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
23.01.2013, 22:56 14
Цитата Сообщение от ZaMaZaN4iK Посмотреть сообщение
У вас возвращается адрес локальной переменной., которая после выхода из функции уничтожается.
фиг вам
она остается в памяти никто её специально уничтожать не собирается
просто память получает статус свободной и любая стерлядь может туда записать что угодно
но указатель то валидный а значения могут быть любые
Цитата Сообщение от Croessmah Посмотреть сообщение
"освобождается"
вот это правильней ибо сам БиллГейтс не сможет гарантировать что в этой памяти лежит
но если знать эти подводные камни можно написать програмки которые будут работать

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

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

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

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

Цитата Сообщение от ValeryS Посмотреть сообщение
и как ты разберешься что вернули указатель на действующий класс или выделили память с нуля
удалять или нет ??
Так получается, что "горе-программист" не только написал либу, а ещё и дал её?
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
23.01.2013, 23:34 16
lepufuxa,
ладно продолжай выделять память в одном блоке уничтожать в другом можешь даже в разных единицах трансляции
Правило "Кто выделил память тот её и уничтожает" тебе видать претит
1
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
23.01.2013, 23:35 17
lepufuxa, вы на форум пришли нас учить?
Почитайте книги, наберитесь опыта, тогда, надеюсь, дискуссия будет поинтересней. Аргументы появятся весомые, а пока это как в воду пукнуть.
Считаю, что ответ был дан:
Цитата Сообщение от ValeryS Посмотреть сообщение
фиг вам
она остается в памяти никто её специально уничтожать не собирается
просто память получает статус свободной и любая стерлядь может туда записать что угодно
но указатель то валидный а значения могут быть любые
P.S. репа на форуме - это просто цифры, они знаний не отражают, читайте посты и вникайте в суть, а не оценивайте карму.
0
73 / 73 / 13
Регистрация: 25.12.2012
Сообщений: 189
Записей в блоге: 2
24.01.2013, 12:38 18
Цитата Сообщение от ValeryS Посмотреть сообщение
lepufuxa,
ладно продолжай выделять память в одном блоке уничтожать в другом можешь даже в разных единицах трансляции
Правило "Кто выделил память тот её и уничтожает" тебе видать претит
изначально так был вопрос сформулирован, что тут поделать?
может класс хранит все указатели и вообще под этим указателем может что угодно в итоге скрываться

Добавлено через 14 минут
Цитата Сообщение от Croessmah Посмотреть сообщение
Сообщение от ZaMaZaN4iK Посмотреть сообщение
которая после выхода из функции уничтожается.
и ведь когда-то она уничтожится? и явно если это будет не внутри функции то после выхода из функции
можно придираться к словам сколько угодно, только сути это не меняет, стековая переменная, созданная внутри функции, после выхода из функции по логике программы не существует.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
24.01.2013, 13:17 19
Цитата Сообщение от UserAK Посмотреть сообщение
может класс хранит все указатели и вообще под этим указателем может что угодно в итоге скрываться
я попытаюсь объяснить на пальцах
C++
1
2
3
4
5
6
int* f()
{int x=2;
return &x;
}
......................................
int *m=f();
в функции выделили память
под переменную x допустим она лежит по адресу 100
функция вернула 100 адрес переменной х
m стала равна 100 адрес валидный
а вот что лежит по этому адресу? может 2( если никто не посягнул на эту память) а может и нет, никто не гарантирует
Это как в файловой системе когда удаляешь файл удаляется запись ссылки на этот файл и сектора помечаются как свободные, но сами сектора никто не переписывает и можно восстановить файл, до тех пор пока другая программа решившая что то записать на диск и увидев пустой сектор не записала свои данные

Цитата Сообщение от UserAK Посмотреть сообщение
стековая переменная, созданная внутри функции, после выхода из функции по логике программы не существует.
переменная не существует а ссылка на её местоположение существует
это как
Незнание закона не освобождает от ответственности. А вот знание нередко освобождает.
(с)Е. Лец

в нормальном программировании так делать нельзя а вот в хакерском нередко используют например вернуть несколько значений (но это сильно платформенно зависимо)

Добавлено через 19 минут
Цитата Сообщение от UserAK Посмотреть сообщение
и ведь когда-то она уничтожится?
она не уничтожается, а объявляется свободной

вот маленький примерчик
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int* func()
{
 int a[10];
 for(int i=0;i<10;i++)
      a[i]=i;
 return a; 
}
int main()
{
int k[10];
int* m=func();
 
 for(int i=0;i<10;i++)
    k[i]=m[i];
 for(int i=0;i<10;i++)  
    printf("%d ",k[i]);
 
 return 0;
 
}
выдаст 0 1 2 3 4 5 6 7 8 9
но если написать так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int* func()
{
 int a[10];
 for(int i=0;i<10;i++)
      a[i]=i;
 return a; 
}
int main()
{
int* m=func();
 
 for(int i=0;i<10;i++)
      printf("%d ",m[i]);
 
 return 0;
 
}
то выдавать будет 0 потом всякий мусор потому, что printf выделяя память под свои переменные портит значения
хотя сам указатель продолжает оставаться валидным ( иначе бы вылетела ошибка доступа к памяти)
0
73 / 73 / 13
Регистрация: 25.12.2012
Сообщений: 189
Записей в блоге: 2
24.01.2013, 13:44 20
Цитата Сообщение от ValeryS Посмотреть сообщение
она не уничтожается, а объявляется свободной
это адрес объявляется свободным, то есть это уже не int* а void*, а переменной больше не существует. она осталась там внутри функции. а вот указатель на переменную в куче так и останется int*

Добавлено через 6 минут
я не знаю какие бывают операционные системы и как может повести себя программа под их управлением, может это виртуальная машина, запущенная на глючном компе, может приложение вместе со всем своим барахлом постоянно переезжает из одной области памяти в другую.
а может я не так понял вопрос. имхо вопрос был про правомерность считать возвращаемый указатель указателем на int.

Добавлено через 11 минут
переменная это же всё-таки абстрактное понятие, ну не знаю как грамотно выразить мысль - данные в контексте методов работы с ними, если есть данные в памяти но они выдернуты из контекста, это уже не переменная, а непонятно что. то есть в таком ракурсе вполне можно считать, что жизненный цикл переменной закончен - переменная уничтожена. нету её больше. это уже не она (как в фильмах ужасов) остался только безжизненный трупик где-то в стеке
1
24.01.2013, 13:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.01.2013, 13:44
Помогаю со студенческими работами здесь

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

Что означает ошибка too few arguments to function ‘int my_func(int, int)’ (язык C++)?
В чём проблема? #include &lt;iostream&gt; int my_func (int i, int j){ int z; z=i+j; return...

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

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


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

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