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

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

01.02.2010, 14:53. Показов 3690. Ответов 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
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
01.02.2010, 15:02
в 1-м случае переменной присваивается адрес начала массива, который задается строкой (кавычками), во 2-м случае принудительно задается адрес, т.е. переменной "a" присваивается адрес, равный 5, а по этому адресу может быть что угодно.
1
 Аватар для Krist_ALL
10 / 10 / 2
Регистрация: 01.02.2010
Сообщений: 317
01.02.2010, 15:11  [ТС]
А почему компилятор не может понять что я хочу чтоб
1. он выделил память
2. положил туда число 5
3 присвоил УКАЗАТЕЛЮ адрес ячейки памяти..

Неужели так трудно?
Конечно можно написать
C++
1
2
int a = 5;
int *b = &a;
но...
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
01.02.2010, 15:22
так и пиши с выделением памяти (через new/malloc) компилятор делает ровно то, что ему говорят и ни шагу больше, откуда он может узнать, что хочет программист, то ли положить туда число, то ли ему нужен в этой переменной жесткий адрес чего то там...
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
01.02.2010, 15:34
А почему компилятор должен что-то телепатически "понимать" и додумывать за разработчика? А если разработчик хотел сделать совсем не то, что "додумал" компилятор?

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

Если хочешь не задумываться о "памяти" и прочих низкоуровневых штучках - добро пожаловать в C# !
Что делает компилятор в приведенных фрагментах кода:
В первом фрагменте:
1. располагает где-то в памяти (скорее всего, в сегменте данных "только для чтения", .rdata) строковую константу s,
2. выделяет память под указатель на строку a,
3. присваивает этому указателю адрес строковой константы s.
Во втором фрагменте:
1. выделяет память под указатель на целое a,
2. пытается присвоить указателю целое значение 5 - облом-с!
0
62 / 62 / 13
Регистрация: 27.01.2009
Сообщений: 279
01.02.2010, 15:37
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";
уже являеться присваиванием указателю начала символьного массива
0
 Аватар для Krist_ALL
10 / 10 / 2
Регистрация: 01.02.2010
Сообщений: 317
01.02.2010, 15:49  [ТС]
Совсем вы меня запутали гуру)))))

В первом коде где инициализация массива?
она сразу при инициализации указателя..так написано..
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";
сколько выделяется памяти во втором случаи?
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
01.02.2010, 15:54
Цитата Сообщение от Krist_ALL Посмотреть сообщение
а так нельзя: char *a = new char; *a = "s"; сколько выделяется памяти во втором случаи?
надо 2 байта (один под символ "s" + один под символ конца строки "\0") а выделяется один
0
62 / 62 / 13
Регистрация: 27.01.2009
Сообщений: 279
01.02.2010, 15:57
попробую по проще, в первом коде -
ты пытаешься записать в неопределенную область памяти значение, ее надо определить, тоесть присвоить твоему указателю адрес ячейки куда будет записываться значение
C++
1
a = &b;
указатель "а" получил адрес переменной "b", этой переменной уже присвоено значение 5,
оператор *а - позволяет получить нам значение расположеное по адресу "b", так понятно?
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
01.02.2010, 15:57
Цитата Сообщение от 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";
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
01.02.2010, 15:57
Константа потому, что "s" у тебя - строковый литерал.
Подумай, чем различаются две строки кода:
C++
1
2
    char* s1 = "s";
    char s2[] = "s";
0
 Аватар для Krist_ALL
10 / 10 / 2
Регистрация: 01.02.2010
Сообщений: 317
01.02.2010, 16:20  [ТС]
Цитата Сообщение от norge_goth Посмотреть сообщение
в первом коде -
ты пытаешься записать в неопределенную область памяти значение, ее надо определить, тоесть присвоить твоему указателю адрес ячейки куда будет записываться значение
C++
1
a = &b;
указатель "а" получил адрес переменной "b", этой переменной уже присвоено значение 5,
оператор *а - позволяет получить нам значение расположеное по адресу "b", так понятно?
так понятно и я знаю это.
C++
1
2
int a = 5;
int *b = &a;
Все понятно это.


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



В этом случае, пространство памяти зарезервировано, чтобы содержать "привет", и затем указатель на первый символ этого блока памяти назначен на terry. Если мы предполагаем, что "привет" сохранен в местоположениях памяти,
Почему пространстов памяти не может быть зарезервировано чтобы соержать 5 (int *a = 5 и затем указать на эту память?
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
01.02.2010, 16:44
Цитата Сообщение от Krist_ALL Посмотреть сообщение
Почему пространстов памяти не может быть зарезервировано чтобы соержать 5 (int *a = 5 и затем указать на эту память?
по простому говоря, строковая константа дает указание компилятору зарезервировать под нее память, цифровая константа так не делает.
1
 Аватар для Krist_ALL
10 / 10 / 2
Регистрация: 01.02.2010
Сообщений: 317
01.02.2010, 16:51  [ТС]
по простому говоря, строковая константа
Объясни плз про константы.непойму поцче именно константы..
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
01.02.2010, 16:56
char *a = "hello"; // "hello" - это константа
int b = 5; //5 - это константа
хз как еще можно объяснить
0
 Аватар для Krist_ALL
10 / 10 / 2
Регистрация: 01.02.2010
Сообщений: 317
01.02.2010, 17:04  [ТС]
константа это когда const a = 5; и нельзя изменить значение а. а тут?
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
01.02.2010, 17:27
Цитата Сообщение от Krist_ALL Посмотреть сообщение
константа это когда const a = 5; и нельзя изменить значение а. а тут?
эмм... хз как это объяснить...
просто само число 5 (в моем примере), а не переменная b является константой
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
02.02.2010, 02:21
Цитата Сообщение от 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
21 / 21 / 7
Регистрация: 06.10.2008
Сообщений: 173
02.02.2010, 11:01
почитай про указатели в книге Б.Эккеля Философия С++ том 1 Введенние в стандартный С++ (начиная с ст.108)
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
02.02.2010, 12:39
accept, человека окончательно запутал...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.02.2010, 12:39
Помогаю со студенческими работами здесь

Про указатели
Здравствуйте я совсем маленький 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() { ...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
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. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru