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

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

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

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

23.01.2013, 15:44. Просмотров 3093. Ответов 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 не очень понял, кто сможет...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,849
23.01.2013, 23:34 #16
lepufuxa,
ладно продолжай выделять память в одном блоке уничтожать в другом можешь даже в разных единицах трансляции
Правило "Кто выделил память тот её и уничтожает" тебе видать претит
1
MrGluck
Модератор
Эксперт CЭксперт С++
7239 / 4407 / 642
Регистрация: 29.11.2010
Сообщений: 11,927
23.01.2013, 23:35 #17
lepufuxa, вы на форум пришли нас учить?
Почитайте книги, наберитесь опыта, тогда, надеюсь, дискуссия будет поинтересней. Аргументы появятся весомые, а пока это как в воду пукнуть.
Считаю, что ответ был дан:
Цитата Сообщение от ValeryS Посмотреть сообщение
фиг вам
она остается в памяти никто её специально уничтожать не собирается
просто память получает статус свободной и любая стерлядь может туда записать что угодно
но указатель то валидный а значения могут быть любые
P.S. репа на форуме - это просто цифры, они знаний не отражают, читайте посты и вникайте в суть, а не оценивайте карму.
0
UserAK
73 / 73 / 4
Регистрация: 25.12.2012
Сообщений: 189
Записей в блоге: 2
24.01.2013, 12:38 #18
Цитата Сообщение от ValeryS Посмотреть сообщение
lepufuxa,
ладно продолжай выделять память в одном блоке уничтожать в другом можешь даже в разных единицах трансляции
Правило "Кто выделил память тот её и уничтожает" тебе видать претит
изначально так был вопрос сформулирован, что тут поделать?
может класс хранит все указатели и вообще под этим указателем может что угодно в итоге скрываться

Добавлено через 14 минут
Цитата Сообщение от Croessmah Посмотреть сообщение
Сообщение от ZaMaZaN4iK Посмотреть сообщение
которая после выхода из функции уничтожается.
и ведь когда-то она уничтожится? и явно если это будет не внутри функции то после выхода из функции
можно придираться к словам сколько угодно, только сути это не меняет, стековая переменная, созданная внутри функции, после выхода из функции по логике программы не существует.
0
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,849
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
UserAK
73 / 73 / 4
Регистрация: 25.12.2012
Сообщений: 189
Записей в блоге: 2
24.01.2013, 13:44 #20
Цитата Сообщение от ValeryS Посмотреть сообщение
она не уничтожается, а объявляется свободной
это адрес объявляется свободным, то есть это уже не int* а void*, а переменной больше не существует. она осталась там внутри функции. а вот указатель на переменную в куче так и останется int*

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

Добавлено через 11 минут
переменная это же всё-таки абстрактное понятие, ну не знаю как грамотно выразить мысль - данные в контексте методов работы с ними, если есть данные в памяти но они выдернуты из контекста, это уже не переменная, а непонятно что. то есть в таком ракурсе вполне можно считать, что жизненный цикл переменной закончен - переменная уничтожена. нету её больше. это уже не она (как в фильмах ужасов) остался только безжизненный трупик где-то в стеке
1
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,849
24.01.2013, 14:01 #21
Цитата Сообщение от UserAK Посмотреть сообщение
имхо вопрос был про правомерность считать возвращаемый указатель указателем на int.
"Не разрешается, но допускается"(с) Я. Гашек "Похождение бравого солдата Швейка"

Добавлено через 3 минуты
Цитата Сообщение от UserAK Посмотреть сообщение
это адрес объявляется свободным, то есть это уже не int* а void*, а переменной больше не существует. она осталась там внутри функции. а вот указатель на переменную в куче так и останется int*
Может быть твоя формулировка более правильная
Слабым местом была у меня всегда была, формулировка своих мыслей


Цитата Сообщение от UserAK Посмотреть сообщение
остался только безжизненный трупик где-то в стеке
Я так понял мы говорим об одном и том же но разными словами
1
UserAK
73 / 73 / 4
Регистрация: 25.12.2012
Сообщений: 189
Записей в блоге: 2
24.01.2013, 14:59 #22
несомненный плюс таких дискуссий в возможности глубже понять суть обсуждаемых процессов потом становится проще оценивать возможные последствия принятия решений. а значит меньше подводных камней. спасибо
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.01.2013, 14:59
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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