С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
DorianLeroy
0 / 0 / 0
Регистрация: 03.02.2011
Сообщений: 7
#1

Про указатели - C++

05.02.2011, 12:04. Просмотров 1610. Ответов 30
Метки нет (Все метки)

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

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<iostream>
using namespace std;
 
int main(){
    int x,*p,*s;
     x = 10;
     s = &x;
     *p = x;
    cout << *p << " " << *s;
    cout << p << " " << s;
    
    system ("pause");
    return 0;
    }
Вот мой ход мыслей по поводу этого кода:
int x,*p,*s - объявляем переменную и указатели на целочисленный тип;
x = 10 - в переменную целочисленного типа(то есть в 16 бит) записываем значение 10.
s = &x - получаем адресс ячейки, где хранится х;
*p = x -получаем адресс ячейки где хранится х;(в комментариях книги написано что указатель p содержит неизвестный адресс(это мне непонятно))
cout << *p << " " << *s - получаем значения ячеек на которые указывают указатели(и там и там выводится значение X: 10, то есть по идее и в указателе р и в указателе s адресс ячейки х);
cout << p << " " << s - смотрим значения самих указателей, видим два разных адреса,хотя я думал здесь должен быть один адресс ячейки X. Здесь возникает вопрос, почему мы видим два разных адреса?
Где мои мысли неверны?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.02.2011, 12:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Про указатели (C++):

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

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

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

Про массивы и указатели - 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++
int a = 5; int *b =&amp;a; cout &lt;&lt;*b&lt;&lt;endl; *b++; cout &lt;&lt;*b&lt;&lt;endl; В строке 4 что происходит? По идее если * то мы работаем...

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

30
st_dent
64 / 64 / 3
Регистрация: 05.07.2010
Сообщений: 219
05.02.2011, 12:16 #2
Цитата Сообщение от DorianLeroy Посмотреть сообщение
C++
1
2
s = &x;
*p = x
;
& -оператор взятия адреса. берем адрес переменной х и заносим его в s
* - оператор "разыменования", или другими словами - доступ к значению объекта через адрес этого объекта.
Т.е. есть какой-то указатель p, смотрим что по этому адресу находится (*p), и заносим туда значение такое же, какое и у х.
и того в памяти у нас две 10. одна доступна по *s, вторая по *p
0
fridi
-8 / 40 / 1
Регистрация: 21.09.2009
Сообщений: 145
05.02.2011, 12:16 #3
s = &x - в s содержится адресс x
*p=x; указатель становится равным 10 тоесть вы присваиваете указателю 10, не получив адресс со-но адресс у p будет отличный от s
0
Евгений М.
1036 / 977 / 54
Регистрация: 28.02.2010
Сообщений: 2,829
Завершенные тесты: 2
05.02.2011, 12:18 #4
А можно знать с какой книги взят этот код? Он по идее не рабочий.

C++
1
*p = x;
Пишет 10-ку в адрес, который указывает p.

C++
1
s = &x;
Теперь s - это адрес переменной x.
1
st_dent
64 / 64 / 3
Регистрация: 05.07.2010
Сообщений: 219
05.02.2011, 12:20 #5
Цитата Сообщение от Евгений М. Посмотреть сообщение
Он по идее не рабочий.
Почему?
0
slavich
12 / 12 / 1
Регистрация: 25.10.2009
Сообщений: 32
05.02.2011, 12:24 #6
Не рабочий потому как под указатель p не выделена память.
Правильно будет так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
 int main(){
    int x,*p=new int,*s;
     x = 10;
     s = &x;
     *p = x;
     cout << *p << " " << *s;
     cout << p << " " << s;
    
    system ("pause");
    delete p;
    return 0;
    }
1
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
05.02.2011, 12:50 #7
slavich, почему, указатель - всего лишь переменная, способная хранить адрес другой переменной. Когда мы создаём переменную, например, типа int, но не инициализируем её, она хранит мусор. Когда мы создаём указатель на тип int, он тоже сначала хранит просто мусор, который, однако, может быть интерпретирован как адрес. Вот по этому-то адресу мы и пишему злополучную десятку.

Добавлено через 2 минуты
Другое дело, удастся ли нам по этому адресу записать хоть что-нибудь.
1
zinador
2 / 2 / 0
Регистрация: 15.11.2009
Сообщений: 100
05.02.2011, 13:43 #8
В таком виде он тоже рабочий .но так как написал
slavich, будет правильней
0
no0ker
101 / 88 / 4
Регистрация: 17.12.2010
Сообщений: 416
05.02.2011, 16:12 #9
zinador, что значит рабочий. не понимаю. считаю ,что данный код, как пример работы с указателем, неприемлим.

C++
1
2
3
4
5
6
7
8
9
10
11
12
int main(){
 
    int *p;
    p = new int; // хоть с этим хоть без этого принципиальной разницы не вижу
 
    int a = 13;
    *p=a; // считаю неверным, только p=&a;
    a++;
    a++;
 
    std::cout << *p; // выведет 13. а не 15.
}
0
slavich
12 / 12 / 1
Регистрация: 25.10.2009
Сообщений: 32
05.02.2011, 16:19 #10
Цитата Сообщение от no0ker Посмотреть сообщение
*p=a; // считаю неверным, только p=&a;
Почитайте про операцию * и указатели.
0
no0ker
101 / 88 / 4
Регистрация: 17.12.2010
Сообщений: 416
05.02.2011, 16:21 #11
повторюсь. как учебный (!) пример - он неприемлим. конечно, в том смысле - если вы знаете, что от него ждать, проблем нет. но если ждёте поведения обычного указателя - увы.
0
panicwassano
592 / 560 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
05.02.2011, 16:30 #12
хм странно, обычно в учебниках так пишут
C++
1
2
3
4
int x,*p
x = 10;
p = &x;
*p = 12;
0
Novij
3 / 3 / 0
Регистрация: 12.12.2010
Сообщений: 99
05.02.2011, 16:56 #13
Иными словами вот так все происходит???
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
    int x,*p;
    x=10;
    p = &x; //В переменную p записываешь адресс x
    *p = x; //Смотришь что находится по адрессу p и заносишь туда значение x
    cout<<p<<endl<<*p<<endl; //Выводишь адресс на экран , потом выводишь на экран что расположенно по этому ажрессу
    //cout<<&x<<endl<<x<<endl; строка дублирует действия предыдущей 
    system("PAUSE");
    return EXIT_SUCCESS;
}
0
Евгений М.
1036 / 977 / 54
Регистрация: 28.02.2010
Сообщений: 2,829
Завершенные тесты: 2
05.02.2011, 16:58 #14
Цитата Сообщение от Novij Посмотреть сообщение
Иными словами вот так все происходит???
Все верно.
0
panicwassano
592 / 560 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
05.02.2011, 16:59 #15
интересно зачем делать *p = x, когда это итак очевидно
0
05.02.2011, 16:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.02.2011, 16:59
Привет! Вот еще темы с ответами:

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

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

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

Про указатели с использованием функции - C++
Вопросы в комментариях к коду #include &lt;iostream&gt; #include &lt;cctype&gt; #include &lt;cstring&gt; using namespace std; void...


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

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

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