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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.65
Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
#1

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

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

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

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

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

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

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

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

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

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

46
Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
01.02.2010, 17:04  [ТС] #16
константа это когда const a = 5; и нельзя изменить значение а. а тут?
0
oxotnik
1590 / 1067 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
01.02.2010, 17:27 #17
Цитата Сообщение от Krist_ALL Посмотреть сообщение
константа это когда const a = 5; и нельзя изменить значение а. а тут?
эмм... хз как это объяснить...
просто само число 5 (в моем примере), а не переменная b является константой
0
accept
4823 / 3244 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
02.02.2010, 02:21 #18
Цитата Сообщение от Krist_ALL
константа это когда const a = 5;
"abc" - это символьный массив
"abc"[1] == 'b'

массив элементов типа X автоматически преобразовывается в указатель на объект типа X
то есть обращение к "abc" преобразует "abc" в адрес символа 'a'

C
1
char *a = "s";
в этом примере "s", который выглядит как { 's', '\0' } в только читаемой памяти
преобразуется в адрес символа 's'
если бы строковой литерал (массив символов) "s" имел имя name, то это было бы
C
1
char *a = &name[0];
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
ggmann
20 / 20 / 1
Регистрация: 06.10.2008
Сообщений: 173
02.02.2010, 11:01 #19
почитай про указатели в книге Б.Эккеля Философия С++ том 1 Введенние в стандартный С++ (начиная с ст.108)
0
oxotnik
1590 / 1067 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
02.02.2010, 12:39 #20
accept, человека окончательно запутал...
1
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;

это то же самое
адрес записывается напрямую без взятия с помощью операции &
просто хочется докопаться до истины...
0
insideone
Модератор
Автор FAQ
3642 / 921 / 50
Регистрация: 10.01.2010
Сообщений: 2,477
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] - это адрес
1
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;
почему не так?
0
oxotnik
1590 / 1067 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
02.02.2010, 21:37 #24
a - это указатель
*a - переменная
0
insideone
Модератор
Автор FAQ
3642 / 921 / 50
Регистрация: 10.01.2010
Сообщений: 2,477
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);
0
Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
02.02.2010, 22:04  [ТС] #26
ээ видимо мы говорим на разных языках уже вторую страницу..
лан.мож потом пойму.
0
insideone
Модератор
Автор FAQ
3642 / 921 / 50
Регистрация: 10.01.2010
Сообщений: 2,477
02.02.2010, 22:08 #27
Обязательно поймете. Просто надо понимать что содержит переменная. Если это переменная - указатель то пихать в неё данные значит совершать большую ошибку =) Переменная - указатель должена содержать адрес где лежат данные, вот и все. Если же вы имеете ввиду что вас смущает что нельзя написать так как вы хотели - что ж.. так придумали язык, приходится уж следовать его правилам. Хотя ничего плохого тут не вижу)
0
novi4ok
551 / 504 / 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, то получишь особый случай обращения к памяти (но уже при выполнении).
0
Андрейка
419 / 223 / 27
Регистрация: 25.03.2009
Сообщений: 744
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; (представь что указатель это стрелочка мы пробегаем по стрелке и выводим значение) объяснил с юморцой но может понятно)
0
novi4ok
551 / 504 / 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;
и напиши сюда что получишь.
0
03.02.2010, 13:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.02.2010, 13:05
Привет! Вот еще темы с ответами:

Про массивы и указатели - C++
#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() { ...

Указатели: правильно ли я понял вопрос? - C++
Есть задание Я написал такой код: #include&lt;iostream&gt; using namespace std; #include&lt;windows&gt; int main() {

Популярно объясните про указатели - C++
Что-то плохо даётся мне тема про указатели. Я хорошо уяснил, что вот так создаётся указатель: int *pointer; Я так же хорошо...

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


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

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

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