Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
DorianLeroy
0 / 0 / 0
Регистрация: 03.02.2011
Сообщений: 7
1

Про указатели

05.02.2011, 12:04. Просмотров 1667. Ответов 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++ Builder разбираюсь с логикой работы с указателями. По определению...

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

Опят про указатели)
int a = 5; int *b =&amp;a; cout &lt;&lt;*b&lt;&lt;endl; *b++; cout &lt;&lt;*b&lt;&lt;endl; В...

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

Про массивы и указатели
#include &lt;iostream&gt; using namespace std; int Digit = {...

30
st_dent
64 / 64 / 12
Регистрация: 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
42 / 40 / 2
Регистрация: 21.09.2009
Сообщений: 145
05.02.2011, 12:16 3
s = &x - в s содержится адресс x
*p=x; указатель становится равным 10 тоесть вы присваиваете указателю 10, не получив адресс со-но адресс у p будет отличный от s
0
Евгений М.
1053 / 990 / 101
Регистрация: 28.02.2010
Сообщений: 2,876
Завершенные тесты: 2
05.02.2011, 12:18 4
А можно знать с какой книги взят этот код? Он по идее не рабочий.

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

C++
1
s = &x;
Теперь s - это адрес переменной x.
1
st_dent
64 / 64 / 12
Регистрация: 05.07.2010
Сообщений: 219
05.02.2011, 12:20 5
Цитата Сообщение от Евгений М. Посмотреть сообщение
Он по идее не рабочий.
Почему?
0
slavich
12 / 12 / 2
Регистрация: 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
Эксперт С++
5009 / 3069 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
05.02.2011, 12:50 7
slavich, почему, указатель - всего лишь переменная, способная хранить адрес другой переменной. Когда мы создаём переменную, например, типа int, но не инициализируем её, она хранит мусор. Когда мы создаём указатель на тип int, он тоже сначала хранит просто мусор, который, однако, может быть интерпретирован как адрес. Вот по этому-то адресу мы и пишему злополучную десятку.

Добавлено через 2 минуты
Другое дело, удастся ли нам по этому адресу записать хоть что-нибудь.
1
zinador
2 / 2 / 2
Регистрация: 15.11.2009
Сообщений: 100
05.02.2011, 13:43 8
В таком виде он тоже рабочий .но так как написал
slavich, будет правильней
0
no0ker
101 / 88 / 7
Регистрация: 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 / 2
Регистрация: 25.10.2009
Сообщений: 32
05.02.2011, 16:19 10
Цитата Сообщение от no0ker Посмотреть сообщение
*p=a; // считаю неверным, только p=&a;
Почитайте про операцию * и указатели.
0
no0ker
101 / 88 / 7
Регистрация: 17.12.2010
Сообщений: 416
05.02.2011, 16:21 11
повторюсь. как учебный (!) пример - он неприемлим. конечно, в том смысле - если вы знаете, что от него ждать, проблем нет. но если ждёте поведения обычного указателя - увы.
0
panicwassano
594 / 562 / 104
Регистрация: 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
Евгений М.
1053 / 990 / 101
Регистрация: 28.02.2010
Сообщений: 2,876
Завершенные тесты: 2
05.02.2011, 16:58 14
Цитата Сообщение от Novij Посмотреть сообщение
Иными словами вот так все происходит???
Все верно.
0
panicwassano
594 / 562 / 104
Регистрация: 07.11.2010
Сообщений: 2,004
05.02.2011, 16:59 15
интересно зачем делать *p = x, когда это итак очевидно
0
no0ker
101 / 88 / 7
Регистрация: 17.12.2010
Сообщений: 416
05.02.2011, 17:31 16
panicwassano, как вы считаете, есть разница между

C++
1
2
3
4
int *a;
int b=13;
a=&b;
*a=44;
и

C++
1
2
3
4
int *a;
                     //int b=13;
                      //a=&b;
*a=44;
вы считаете оба эти примера пригодными для обучения?

Добавлено через 1 минуту

Не по теме:

оба примера компилируются вроде как

0
taras atavin
4204 / 1766 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
05.02.2011, 17:46 17
Цитата Сообщение от DorianLeroy Посмотреть сообщение
*p = x -получаем адресс ячейки где хранится х;
Нет. В ячейку по адресу p копируем значение x.

Добавлено через 1 минуту
Цитата Сообщение от DorianLeroy Посмотреть сообщение
то есть по идее и в указателе р и в указателе s адресс ячейки х
Нет. Кто тебе сказал, что одно значение может быть только в одной ячейке?
0
panicwassano
594 / 562 / 104
Регистрация: 07.11.2010
Сообщений: 2,004
05.02.2011, 17:49 18
no0ker ты не понял про что я
C++
1
2
3
4
int x,*p;
    x=10;
    p = &x; //В переменную p записываешь адресс x
    *p = x; //вот это зачем если p итак указывает на x
0
no0ker
05.02.2011, 17:52
  #19

Не по теме:

возможно. =) тем не менее, мне не нравится код в первом посте, а вам?

0
panicwassano
05.02.2011, 17:54     Про указатели
  #20

Не по теме:

и мне, я не встречал подобного в учебнике :)

0
05.02.2011, 17:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.02.2011, 17:54
Привет! Вот еще темы с ответами:

Вопрос про указатели
char *a = &quot;s&quot;; 1. Выделяется место в памяти 2. В это место записывается s...

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

Популярно объясните про указатели
Что-то плохо даётся мне тема про указатели. Я хорошо уяснил, что вот так...


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

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

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