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

Вопрос про указатели - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.65
Krist_ALL
 Аватар для Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
01.02.2010, 14:53     Вопрос про указатели #1
C++
1
char *a = "s";
1. Выделяется место в памяти
2. В это место записывается s
3. Указателю a приваивают адрес памяти где храниться s
так?

а почему нельзя вот так
C++
1
int *a = 5;
Ну никак не пойму. Объясните пожалуйста.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.02.2010, 14:53     Вопрос про указатели
Посмотрите здесь:

Вопрос про указатели C++
C++ Опят про указатели)
Вопрос про указатели на массивы C++
Про указатели . C++
Про указатели C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Krist_ALL
 Аватар для Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
02.02.2010, 20:03  [ТС]     Вопрос про указатели #21
Цитата Сообщение от oxotnik Посмотреть сообщение
accept, человека окончательно запутал...
угу(
непонял вот это
Код C

1



char *a = 's';

не сработает

Код C

1



char *a = (char *) 's';

сработает, но код символа 's' из символьной таблицы (ASCII например) преобразуется в адрес, который хоть и приведётся к правильному типу адреса, но вряд ли куда-нибудь правильно укажет

Код C

1



char *a = (char *) 0x73;

Код C

1



char *a = (char *) 115;

это то же самое
адрес записывается напрямую без взятия с помощью операции &
просто хочется докопаться до истины...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
insideone
Модератор
Автор FAQ
 Аватар для insideone
3623 / 901 / 48
Регистрация: 10.01.2010
Сообщений: 2,429
02.02.2010, 21:21     Вопрос про указатели #22
А что с истиной то? Если бы работаете с char* a то знайте - а это переменная. да? что в ней храниться? адрес. Там нет букв. Буквы можно найти так a[0] - первая буква, a[1] вторая буква и т.д. Будьте осторожные с адресами, работать с ними нужно лишь тогда когда вам это действительно нужно и вы понимаете что делаете.
В случае когда вы пишите
char* a = "Привет мир";
на самом деле происходит примерно такое (просто чтобы понять)
C++
1
2
temp[11] = { 'П', 'р', 'и', 'в', 'е', 'т', ' ', 'м', 'и', 'р', 0};
char* a = &temp[0];
char* a - это указатель (переменная которая хранит адрес)
&temp[0] - это адрес
Krist_ALL
 Аватар для Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
02.02.2010, 21:34  [ТС]     Вопрос про указатели #23
insideone? это понятно.
ну почему не может быть так
int *a = 5;
Тоже самое бы что
int *a = new int;
*a=5;
почему не так?
oxotnik
 Аватар для oxotnik
1584 / 1061 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
02.02.2010, 21:37     Вопрос про указатели #24
a - это указатель
*a - переменная
insideone
Модератор
Автор FAQ
 Аватар для insideone
3623 / 901 / 48
Регистрация: 10.01.2010
Сообщений: 2,429
02.02.2010, 22:04     Вопрос про указатели #25
Цитата Сообщение от Krist_ALL Посмотреть сообщение
insideone? это понятно.
ну почему не может быть так
int *a = 5;
Тоже самое бы что
int *a = new int;
*a=5;
почему не так?
Просто new int возвращает адрес по которому можно теперь записать число.
а тут
C++
1
int *a = 5;
Вы придумываете адрес сами... а вот что будет лежать по 5ому адресу это уже другой вопрос.

Добавлено через 2 минуты
К тому же почему вам не нравится такая запись
C++
1
int* a = new int(5);
Krist_ALL
 Аватар для Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
02.02.2010, 22:04  [ТС]     Вопрос про указатели #26
ээ видимо мы говорим на разных языках уже вторую страницу..
лан.мож потом пойму.
insideone
Модератор
Автор FAQ
 Аватар для insideone
3623 / 901 / 48
Регистрация: 10.01.2010
Сообщений: 2,429
02.02.2010, 22:08     Вопрос про указатели #27
Обязательно поймете. Просто надо понимать что содержит переменная. Если это переменная - указатель то пихать в неё данные значит совершать большую ошибку =) Переменная - указатель должена содержать адрес где лежат данные, вот и все. Если же вы имеете ввиду что вас смущает что нельзя написать так как вы хотели - что ж.. так придумали язык, приходится уж следовать его правилам. Хотя ничего плохого тут не вижу)
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
02.02.2010, 22:15     Вопрос про указатели #28
Цитата Сообщение от Krist_ALL Посмотреть сообщение
Почему пространстов памяти не может быть зарезервировано чтобы соержать 5 (int *a = 5 и затем указать на эту память?
кто говорит, что нельзя? пожалуйста!

вот это:

C++
1
int *a = 5;
выделяет память под указатель на целое (а), и ему присваивается значение 5. теперь этот указатель (а) указывает на ячейку памяти с адресом 5. как правило там то ли вектора прерываний, то ли что-то такое, уже точно не помню. по крайней мере , у твоей программы доступа к этой ячейке памяти нет, и если ты попытаешься туда что-то записать (например *a = 10, то получишь особый случай обращения к памяти (но уже при выполнении).
Андрейка
410 / 214 / 24
Регистрация: 25.03.2009
Сообщений: 716
03.02.2010, 00:15     Вопрос про указатели #29
Krist_ALL,
и так ) понимаешь указатель - это объект который хранит адрес другого объекта ! то есть мы не можем присваивать туда никакие значения типа 5, 6.6 и т д . Указатель может хранить адрес переменных в которые записаны данные ( опять же 5, 6.6), теперь чтобы работать с переменными посредством указателя мы используем - * то есть
int x = 5;
int *ptr = &x;
*ptr = 10;
теперь на самом деле в x записано 10

так далее..
operator new
будем работать с динамической памятью
посредством такой конструкции int * ptr = new int; мы с помощью operator new выделяем динамическую память (представь кусок какой то памяти) и настраиваем указатель на этот кусок.
Далее чтобы пихать туда какие то значения мы используем *ptr = 10; допустим.
Получили указатель ссылающийся на какой то кусок в котором записано 10. Далее чтобы получить само это значение на выводе используем cout << *ptr; (представь что указатель это стрелочка мы пробегаем по стрелке и выводим значение) объяснил с юморцой но может понятно)
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
03.02.2010, 13:05     Вопрос про указатели #30
Цитата Сообщение от Андрейка Посмотреть сообщение
Krist_ALL,
и так )
... и эдак

Цитата Сообщение от Андрейка Посмотреть сообщение
Krist_ALL,
понимаешь указатель - это объект который хранит адрес другого объекта ! то есть мы не можем присваивать туда никакие значения типа 5, 6.6 и т д .
зачем человека в заблуждение вводишь! указатель хранит то что туда положат! скомпилируй и выполни:

C++
1
2
int *pInt = (int*)5;
cout << pInt;
и напиши сюда что получишь.
Yurii_74
paladin
 Аватар для Yurii_74
279 / 179 / 3
Регистрация: 25.02.2009
Сообщений: 592
03.02.2010, 13:21     Вопрос про указатели #31
Воспринимай это как:
C++
1
[B]int*[/B] a;
То есть мы объявляем указатель с именем a;
C++
1
int* a = 5;
а затем пытаемся сделать a = 5, тогда как хотим сделать
C++
1
a = new int; *a = 5;
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
03.02.2010, 13:36     Вопрос про указатели #32
Цитата Сообщение от Yurii_74 Посмотреть сообщение
Воспринимай это как:
C++
1
[B]int*[/B] a;
То есть мы объявляем указатель с именем a;
C++
1
int* a = 5;
а затем пытаемся сделать a = 5, тогда как хотим сделать
C++
1
a = new int; *a = 5;
откуда ты знаешь что "мы хотим"? мы можем хотеть именно указателю пятерку присвоить! и это делается задней левой.
Yurii_74
paladin
 Аватар для Yurii_74
279 / 179 / 3
Регистрация: 25.02.2009
Сообщений: 592
03.02.2010, 15:06     Вопрос про указатели #33
Цитата Сообщение от novi4ok Посмотреть сообщение
откуда ты знаешь что "мы хотим"? мы можем хотеть именно указателю пятерку присвоить! и это делается задней левой.
Из того, что написал топикстартер я сделал такой вывод. Он явно не хотел получить то, что получил.

Не по теме:

Don't try to provoke me. Be nice, please.

@KOT@
81 / 39 / 2
Регистрация: 29.01.2010
Сообщений: 386
03.02.2010, 16:04     Вопрос про указатели #34
Цитата Сообщение от novi4ok Посмотреть сообщение
зачем человека в заблуждение вводишь! указатель хранит то что туда положат!
Нет. Переменная хранит то, что туда положишь. А указатель хранит лишь какой-то адрес.
C++
1
int* a;
Это укзатель на тип инт. И на самом деле a можно присвоить лишь адрес - не больше.
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
03.02.2010, 17:38     Вопрос про указатели #35
Цитата Сообщение от @KOT@ Посмотреть сообщение
Нет. Переменная хранит то, что туда положишь. А указатель хранит лишь какой-то адрес.
C++
1
int* a;
Это укзатель на тип инт. И на самом деле a можно присвоить лишь адрес - не больше.
наивное заблуждение. эта переменная - просто четыре байта, которые могут содержать любую комбинацию бит. и присвоить такой переменной можно также любые четыре байта. лишь компилятор знает о том, что это - указатель на целое, и будет генерировать соотв. код из того, что ты напишешь. нужно "смело смотреть правде в глаза"
@KOT@
81 / 39 / 2
Регистрация: 29.01.2010
Сообщений: 386
03.02.2010, 17:50     Вопрос про указатели #36
Цитата Сообщение от novi4ok Посмотреть сообщение
наивное заблуждение. эта переменная - просто четыре байта, которые могут содержать любую комбинацию бит. и присвоить такой переменной можно также любые четыре байта. лишь компилятор знает о том, что это - указатель на целое, и будет генерировать соотв. код из того, что ты напишешь. нужно "смело смотреть правде в глаза"
Верно указатель хранит эту комбинацию бит. Но использовать ее может только как адрес в памяти. Поэтому в указатель нельзя положить только числовую константу - которая и будет адресом памяти. Символьную константу мы засунуть в указатель не можем, лишь адрес на нее.
И когда мы пишем
C++
1
char* a = 'a';
на самом деле компилятор делает следующее
C++
1
2
char a = 'a';
char* a = a;
Добавлено через 3 минуты
Цитата Сообщение от novi4ok Посмотреть сообщение
.скомпилируй и выполни:
C++
1
2
int *pInt = (int*)5;
cout << pInt;
и напиши сюда что получишь.
Когда мы пишем
C++
1
int *pInt=5;
указатель получает значение равное 5 и указывает на ячейку в памяти с адресом 5.

когда
C++
1
int *pInt = (int*)5;
указатель получает адрес ячейки памяти в которой содержиться константа 5.
Поэтому соответсвенно будет выведено число 5.
Зоти Сергей
 Аватар для Зоти Сергей
228 / 226 / 13
Регистрация: 18.12.2009
Сообщений: 316
03.02.2010, 18:17     Вопрос про указатели #37
Ага... будет выведено... Access Violation...
Чего это там вдруг константа 5 потеряла?
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
03.02.2010, 18:28     Вопрос про указатели #38
Цитата Сообщение от @KOT@ Посмотреть сообщение
Когда мы пишем
C++
1
int *pInt=5;
указатель получает значение равное 5 и указывает на ячейку в памяти с адресом 5.
только при этом не забывай упоминать, что ты просто так полагаешь, или тебе так хотелось бы. но зачем утверждать? сначала напиши и скомпилируй (точнее, попробуй скомпилировать), потом утверждай. именно таким образом компилятор это сделать не даст. но имеется достаточно много других способов записать в переменную-указатель пятерку или любое другое число.
@KOT@
81 / 39 / 2
Регистрация: 29.01.2010
Сообщений: 386
03.02.2010, 18:41     Вопрос про указатели #39
Цитата Сообщение от novi4ok Посмотреть сообщение
только при этом не забывай упоминать, что ты просто так полагаешь, или тебе так хотелось бы. но зачем утверждать? сначала напиши и скомпилируй (точнее, попробуй скомпилировать), потом утверждай. именно таким образом компилятор это сделать не даст. но имеется достаточно много других способов записать в переменную-указатель пятерку или любое другое число.
Я утверждаю потому что знаю. Потому что все это прекрасно знают.

И очень бы хотелось бы услышать способ, при котором ты сможешь занести в указатель любое число. Никогда с таким не сталкивался.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.02.2010, 19:01     Вопрос про указатели
Еще ссылки по теме:

Популярно объясните про указатели C++
Пояснить про указатели и ссылки C++
Про указатели C++

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

Или воспользуйтесь поиском по форуму:
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 1
03.02.2010, 19:01     Вопрос про указатели #40
Цитата Сообщение от @KOT@ Посмотреть сообщение
И очень бы хотелось бы услышать способ, при котором ты сможешь занести в указатель любое число.
C++
1
int* a = reinterpret_cast<int*>(0xDEAD);
Yandex
Объявления
03.02.2010, 19:01     Вопрос про указатели
Ответ Создать тему
Опции темы

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