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

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

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

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

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

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++
#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 что происходит? По идее если * то мы работаем...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
oxotnik
1589 / 1066 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
01.02.2010, 15:02 #2
в 1-м случае переменной присваивается адрес начала массива, который задается строкой (кавычками), во 2-м случае принудительно задается адрес, т.е. переменной "a" присваивается адрес, равный 5, а по этому адресу может быть что угодно.
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
1589 / 1066 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
01.02.2010, 15:22 #4
так и пиши с выделением памяти (через new/malloc) компилятор делает ровно то, что ему говорят и ни шагу больше, откуда он может узнать, что хочет программист, то ли положить туда число, то ли ему нужен в этой переменной жесткий адрес чего то там...
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,368
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
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
1589 / 1066 / 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++
2300 / 1670 / 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
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,368
01.02.2010, 15:57 #11
Константа потому, что "s" у тебя - строковый литерал.
Подумай, чем различаются две строки кода:
C++
1
2
    char* s1 = "s";
    char s2[] = "s";
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
1589 / 1066 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
01.02.2010, 16:44 #13
Цитата Сообщение от Krist_ALL Посмотреть сообщение
Почему пространстов памяти не может быть зарезервировано чтобы соержать 5 (int *a = 5 и затем указать на эту память?
по простому говоря, строковая константа дает указание компилятору зарезервировать под нее память, цифровая константа так не делает.
Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
01.02.2010, 16:51  [ТС] #14
по простому говоря, строковая константа
Объясни плз про константы.непойму поцче именно константы..
oxotnik
1589 / 1066 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
01.02.2010, 16:56 #15
char *a = "hello"; // "hello" - это константа
int b = 5; //5 - это константа
хз как еще можно объяснить
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.02.2010, 16:56
Привет! Вот еще темы с ответами:

Про массивы и указатели - 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++
есть переменное и указатель.. Значение нашей переменной случайный адрес, Как менять адрес указателя, таким образом, что бы она стала...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
01.02.2010, 16:56
Ответ Создать тему
Опции темы

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