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

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

01.02.2010, 14:53. Показов 3607. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru