Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
 Аватар для Krist_ALL
10 / 10 / 2
Регистрация: 01.02.2010
Сообщений: 317

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

01.02.2010, 14:53. Показов 3697. Ответов 46
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
char *a = "s";
1. Выделяется место в памяти
2. В это место записывается s
3. Указателю a приваивают адрес памяти где храниться s
так?

а почему нельзя вот так
C++
1
int *a = 5;
Ну никак не пойму. Объясните пожалуйста.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.02.2010, 14:53
Ответы с готовыми решениями:

Вопрос про указатели
#include <iostream.h> int main() { int x; int *Pointer; pointer = &x; cout << pointer; cout << *ponter; return 0; ...

Вопрос про указатели на массивы
В книге написано int a; int *p; p = &a; //У меня выдает ошибку p = &a; //Так работает p = ПОЛУЧИТЬ_адрес_объекта - Это...

Про указатели
В среде C++ Builder разбираюсь с логикой работы с указателями. По определению (в моем его понимании) указатель это адрес в памяти на...

46
 Аватар для Krist_ALL
10 / 10 / 2
Регистрация: 01.02.2010
Сообщений: 317
02.02.2010, 20:03  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от 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;

это то же самое
адрес записывается напрямую без взятия с помощью операции &
просто хочется докопаться до истины...
0
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
02.02.2010, 21:21
А что с истиной то? Если бы работаете с char* a то знайте - а это переменная. да? что в ней храниться? адрес. Там нет букв. Буквы можно найти так a[0] - первая буква, a[1] вторая буква и т.д. Будьте осторожные с адресами, работать с ними нужно лишь тогда когда вам это действительно нужно и вы понимаете что делаете.
В случае когда вы пишите
char* a = "Привет мир";
на самом деле происходит примерно такое (просто чтобы понять)
C++
1
2
temp[11] = { 'П', 'р', 'и', 'в', 'е', 'т', ' ', 'м', 'и', 'р', 0};
char* a = &temp[0];
char* a - это указатель (переменная которая хранит адрес)
&temp[0] - это адрес
1
 Аватар для Krist_ALL
10 / 10 / 2
Регистрация: 01.02.2010
Сообщений: 317
02.02.2010, 21:34  [ТС]
insideone? это понятно.
ну почему не может быть так
int *a = 5;
Тоже самое бы что
int *a = new int;
*a=5;
почему не так?
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
02.02.2010, 21:37
a - это указатель
*a - переменная
0
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
02.02.2010, 22:04
Цитата Сообщение от 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);
0
 Аватар для Krist_ALL
10 / 10 / 2
Регистрация: 01.02.2010
Сообщений: 317
02.02.2010, 22:04  [ТС]
ээ видимо мы говорим на разных языках уже вторую страницу..
лан.мож потом пойму.
0
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
02.02.2010, 22:08
Обязательно поймете. Просто надо понимать что содержит переменная. Если это переменная - указатель то пихать в неё данные значит совершать большую ошибку =) Переменная - указатель должена содержать адрес где лежат данные, вот и все. Если же вы имеете ввиду что вас смущает что нельзя написать так как вы хотели - что ж.. так придумали язык, приходится уж следовать его правилам. Хотя ничего плохого тут не вижу)
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
02.02.2010, 22:15
Цитата Сообщение от Krist_ALL Посмотреть сообщение
Почему пространстов памяти не может быть зарезервировано чтобы соержать 5 (int *a = 5 и затем указать на эту память?
кто говорит, что нельзя? пожалуйста!

вот это:

C++
1
int *a = 5;
выделяет память под указатель на целое (а), и ему присваивается значение 5. теперь этот указатель (а) указывает на ячейку памяти с адресом 5. как правило там то ли вектора прерываний, то ли что-то такое, уже точно не помню. по крайней мере , у твоей программы доступа к этой ячейке памяти нет, и если ты попытаешься туда что-то записать (например *a = 10, то получишь особый случай обращения к памяти (но уже при выполнении).
0
425 / 229 / 87
Регистрация: 25.03.2009
Сообщений: 744
03.02.2010, 00:15
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; (представь что указатель это стрелочка мы пробегаем по стрелке и выводим значение) объяснил с юморцой но может понятно)
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
03.02.2010, 13:05
Цитата Сообщение от Андрейка Посмотреть сообщение
Krist_ALL,
и так )
... и эдак

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

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

Не по теме:

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

0
81 / 39 / 3
Регистрация: 29.01.2010
Сообщений: 386
03.02.2010, 16:04
Цитата Сообщение от novi4ok Посмотреть сообщение
зачем человека в заблуждение вводишь! указатель хранит то что туда положат!
Нет. Переменная хранит то, что туда положишь. А указатель хранит лишь какой-то адрес.
C++
1
int* a;
Это укзатель на тип инт. И на самом деле a можно присвоить лишь адрес - не больше.
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
03.02.2010, 17:38
Цитата Сообщение от @KOT@ Посмотреть сообщение
Нет. Переменная хранит то, что туда положишь. А указатель хранит лишь какой-то адрес.
C++
1
int* a;
Это укзатель на тип инт. И на самом деле a можно присвоить лишь адрес - не больше.
наивное заблуждение. эта переменная - просто четыре байта, которые могут содержать любую комбинацию бит. и присвоить такой переменной можно также любые четыре байта. лишь компилятор знает о том, что это - указатель на целое, и будет генерировать соотв. код из того, что ты напишешь. нужно "смело смотреть правде в глаза"
0
81 / 39 / 3
Регистрация: 29.01.2010
Сообщений: 386
03.02.2010, 17:50
Цитата Сообщение от 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.
0
 Аватар для Зоти Сергей
230 / 227 / 65
Регистрация: 18.12.2009
Сообщений: 316
03.02.2010, 18:17
Ага... будет выведено... Access Violation...
Чего это там вдруг константа 5 потеряла?
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
03.02.2010, 18:28
Цитата Сообщение от @KOT@ Посмотреть сообщение
Когда мы пишем
C++
1
int *pInt=5;
указатель получает значение равное 5 и указывает на ячейку в памяти с адресом 5.
только при этом не забывай упоминать, что ты просто так полагаешь, или тебе так хотелось бы. но зачем утверждать? сначала напиши и скомпилируй (точнее, попробуй скомпилировать), потом утверждай. именно таким образом компилятор это сделать не даст. но имеется достаточно много других способов записать в переменную-указатель пятерку или любое другое число.
0
81 / 39 / 3
Регистрация: 29.01.2010
Сообщений: 386
03.02.2010, 18:41
Цитата Сообщение от novi4ok Посмотреть сообщение
только при этом не забывай упоминать, что ты просто так полагаешь, или тебе так хотелось бы. но зачем утверждать? сначала напиши и скомпилируй (точнее, попробуй скомпилировать), потом утверждай. именно таким образом компилятор это сделать не даст. но имеется достаточно много других способов записать в переменную-указатель пятерку или любое другое число.
Я утверждаю потому что знаю. Потому что все это прекрасно знают.

И очень бы хотелось бы услышать способ, при котором ты сможешь занести в указатель любое число. Никогда с таким не сталкивался.
0
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
03.02.2010, 19:01
Цитата Сообщение от @KOT@ Посмотреть сообщение
И очень бы хотелось бы услышать способ, при котором ты сможешь занести в указатель любое число.
C++
1
int* a = reinterpret_cast<int*>(0xDEAD);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.02.2010, 19:01
Помогаю со студенческими работами здесь

Про указатели
Здравствуйте я совсем маленький C++ программер, вот сейчас разбираюсь с указателями. Подскажите пожалуйста. В книге встретил пример,...

Про указатели .
Всем привет: Продолжаю свою традицию: Вот придумал необычную задачку, может кому то она покажется неинтересной, сложная или простая...

Опят про указатели)
int a = 5; int *b =&amp;a; cout &lt;&lt;*b&lt;&lt;endl; *b++; cout &lt;&lt;*b&lt;&lt;endl; В строке 4 что происходит? По идее если * то мы работаем...

Про массивы и указатели
#include &lt;iostream&gt; using namespace std; int Digit = { {1,8,6,7},{3,2,9,4},{5,1,2,7},{8,6,2,5} }, test; int main() { ...

Пояснить про указатели и ссылки
есть переменное и указатель.. Значение нашей переменной случайный адрес, Как менять адрес указателя, таким образом, что бы она стала...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru