Форум программистов, компьютерный форум 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++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
oxotnik
 Аватар для oxotnik
1584 / 1061 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
01.02.2010, 15:02     Вопрос про указатели #2
в 1-м случае переменной присваивается адрес начала массива, который задается строкой (кавычками), во 2-м случае принудительно задается адрес, т.е. переменной "a" присваивается адрес, равный 5, а по этому адресу может быть что угодно.
Krist_ALL
 Аватар для Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
01.02.2010, 15:11  [ТС]     Вопрос про указатели #3
А почему компилятор не может понять что я хочу чтоб
1. он выделил память
2. положил туда число 5
3 присвоил УКАЗАТЕЛЮ адрес ячейки памяти..

Неужели так трудно?
Конечно можно написать
C++
1
2
int a = 5;
int *b = &a;
но...
oxotnik
 Аватар для oxotnik
1584 / 1061 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
01.02.2010, 15:22     Вопрос про указатели #4
так и пиши с выделением памяти (через new/malloc) компилятор делает ровно то, что ему говорят и ни шагу больше, откуда он может узнать, что хочет программист, то ли положить туда число, то ли ему нужен в этой переменной жесткий адрес чего то там...
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,309
01.02.2010, 15:34     Вопрос про указатели #5
А почему компилятор должен что-то телепатически "понимать" и додумывать за разработчика? А если разработчик хотел сделать совсем не то, что "додумал" компилятор?

"Компьютер выполняет то, что вы приказали ему сделать, а не то, что вы хотели бы, чтобы он сделал." (с) не мое

Если хочешь не задумываться о "памяти" и прочих низкоуровневых штучках - добро пожаловать в C# !
Что делает компилятор в приведенных фрагментах кода:
В первом фрагменте:
1. располагает где-то в памяти (скорее всего, в сегменте данных "только для чтения", .rdata) строковую константу s,
2. выделяет память под указатель на строку a,
3. присваивает этому указателю адрес строковой константы s.
Во втором фрагменте:
1. выделяет память под указатель на целое a,
2. пытается присвоить указателю целое значение 5 - облом-с!
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
01.02.2010, 15:37     Вопрос про указатели #6
C++
1
int *a = 5;
Так присваивать нельзя потому что ты не инициализировал указатель, тоесть ты пытаешься записать значение 5 неведомо куда, правильно так:

C++
1
2
3
int *a, b = 5;
a = &b;
cout << *a << endl; //выведет 5
В первом же варианте
C++
1
char *a = "s";
уже являеться присваиванием указателю начала символьного массива
Krist_ALL
 Аватар для Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
01.02.2010, 15:49  [ТС]     Вопрос про указатели #7
Совсем вы меня запутали гуру)))))

В первом коде где инициализация массива?
она сразу при инициализации указателя..так написано..
As in the case of arrays, the compiler allows the special case that we want to initialize the content at which the pointer points with constants at the same moment the pointer is declared:



char * terry = "hello";



In this case, memory space is reserved to contain "hello" and then a pointer to the first character of this memory block is assigned to terry. If we imagine that "hello" is stored at the memory locations that start at addresses 1702, we can represent the previous declaration as:
1. располагает где-то в памяти (скорее всего, в сегменте данных "только для чтения", .rdata) строковую константу s,
почему константа?

ех совсем запутался(


и почему так можно:
int *a = new int;
*a = 5;

а так нельзя:
char *a = new char;
*a = "s";
сколько выделяется памяти во втором случаи?
oxotnik
 Аватар для oxotnik
1584 / 1061 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
01.02.2010, 15:54     Вопрос про указатели #8
Цитата Сообщение от Krist_ALL Посмотреть сообщение
а так нельзя: char *a = new char; *a = "s"; сколько выделяется памяти во втором случаи?
надо 2 байта (один под символ "s" + один под символ конца строки "\0") а выделяется один
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
01.02.2010, 15:57     Вопрос про указатели #9
попробую по проще, в первом коде -
ты пытаешься записать в неопределенную область памяти значение, ее надо определить, тоесть присвоить твоему указателю адрес ячейки куда будет записываться значение
C++
1
a = &b;
указатель "а" получил адрес переменной "b", этой переменной уже присвоено значение 5,
оператор *а - позволяет получить нам значение расположеное по адресу "b", так понятно?
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
01.02.2010, 15:57     Вопрос про указатели #10
Цитата Сообщение от Krist_ALL Посмотреть сообщение
почему константа?
У тебя же в приведенной тобой цитате написано
Цитата Сообщение от Krist_ALL Посмотреть сообщение
As in the case of arrays, the compiler allows the special case that we want to initialize the content at which the pointer points with constants at the same moment the pointer is declared:
char * terry = "hello";
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,309
01.02.2010, 15:57     Вопрос про указатели #11
Константа потому, что "s" у тебя - строковый литерал.
Подумай, чем различаются две строки кода:
C++
1
2
    char* s1 = "s";
    char s2[] = "s";
Krist_ALL
 Аватар для Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
01.02.2010, 16:20  [ТС]     Вопрос про указатели #12
Цитата Сообщение от norge_goth Посмотреть сообщение
в первом коде -
ты пытаешься записать в неопределенную область памяти значение, ее надо определить, тоесть присвоить твоему указателю адрес ячейки куда будет записываться значение
C++
1
a = &b;
указатель "а" получил адрес переменной "b", этой переменной уже присвоено значение 5,
оператор *а - позволяет получить нам значение расположеное по адресу "b", так понятно?
так понятно и я знаю это.
C++
1
2
int a = 5;
int *b = &a;
Все понятно это.


символ * terry = "привет";



В этом случае, пространство памяти зарезервировано, чтобы содержать "привет", и затем указатель на первый символ этого блока памяти назначен на terry. Если мы предполагаем, что "привет" сохранен в местоположениях памяти,
Почему пространстов памяти не может быть зарезервировано чтобы соержать 5 (int *a = 5 и затем указать на эту память?
oxotnik
 Аватар для oxotnik
1584 / 1061 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
01.02.2010, 16:44     Вопрос про указатели #13
Цитата Сообщение от Krist_ALL Посмотреть сообщение
Почему пространстов памяти не может быть зарезервировано чтобы соержать 5 (int *a = 5 и затем указать на эту память?
по простому говоря, строковая константа дает указание компилятору зарезервировать под нее память, цифровая константа так не делает.
Krist_ALL
 Аватар для Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
01.02.2010, 16:51  [ТС]     Вопрос про указатели #14
по простому говоря, строковая константа
Объясни плз про константы.непойму поцче именно константы..
oxotnik
 Аватар для oxotnik
1584 / 1061 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
01.02.2010, 16:56     Вопрос про указатели #15
char *a = "hello"; // "hello" - это константа
int b = 5; //5 - это константа
хз как еще можно объяснить
Krist_ALL
 Аватар для Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
01.02.2010, 17:04  [ТС]     Вопрос про указатели #16
константа это когда const a = 5; и нельзя изменить значение а. а тут?
oxotnik
 Аватар для oxotnik
1584 / 1061 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
01.02.2010, 17:27     Вопрос про указатели #17
Цитата Сообщение от Krist_ALL Посмотреть сообщение
константа это когда const a = 5; и нельзя изменить значение а. а тут?
эмм... хз как это объяснить...
просто само число 5 (в моем примере), а не переменная b является константой
accept
4838 / 3237 / 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;
это то же самое
адрес записывается напрямую без взятия с помощью операции &
ggmann
 Аватар для ggmann
20 / 20 / 1
Регистрация: 06.10.2008
Сообщений: 173
02.02.2010, 11:01     Вопрос про указатели #19
почитай про указатели в книге Б.Эккеля Философия С++ том 1 Введенние в стандартный С++ (начиная с ст.108)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.02.2010, 12:39     Вопрос про указатели
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
oxotnik
 Аватар для oxotnik
1584 / 1061 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
02.02.2010, 12:39     Вопрос про указатели #20
accept, человека окончательно запутал...
Yandex
Объявления
02.02.2010, 12:39     Вопрос про указатели
Ответ Создать тему
Опции темы

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