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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
DorianLeroy
 Аватар для DorianLeroy
0 / 0 / 0
Регистрация: 03.02.2011
Сообщений: 7
05.02.2011, 12:04     Про указатели #1
Здравствуйте я совсем маленький 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. Здесь возникает вопрос, почему мы видим два разных адреса?
Где мои мысли неверны?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.02.2011, 12:04     Про указатели
Посмотрите здесь:

Вопрос про указатели C++
C++ Вопрос про указатели
C++ Опят про указатели)
Вопрос про указатели на массивы C++
Про указатели . C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
fridi
-8 / 40 / 1
Регистрация: 21.09.2009
Сообщений: 145
05.02.2011, 12:16     Про указатели #3
s = &x - в s содержится адресс x
*p=x; указатель становится равным 10 тоесть вы присваиваете указателю 10, не получив адресс со-но адресс у p будет отличный от s
Евгений М.
1033 / 974 / 53
Регистрация: 28.02.2010
Сообщений: 2,817
Завершенные тесты: 2
05.02.2011, 12:18     Про указатели #4
А можно знать с какой книги взят этот код? Он по идее не рабочий.

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

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

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

Не по теме:

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

taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
05.02.2011, 17:46     Про указатели #17
Цитата Сообщение от DorianLeroy Посмотреть сообщение
*p = x -получаем адресс ячейки где хранится х;
Нет. В ячейку по адресу p копируем значение x.

Добавлено через 1 минуту
Цитата Сообщение от DorianLeroy Посмотреть сообщение
то есть по идее и в указателе р и в указателе s адресс ячейки х
Нет. Кто тебе сказал, что одно значение может быть только в одной ячейке?
panicwassano
590 / 558 / 20
Регистрация: 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
no0ker
05.02.2011, 17:52
  #19

Не по теме:

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

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

C++ Про указатели с использованием функции
Пояснить про указатели и ссылки C++
Про указатели C++

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

Или воспользуйтесь поиском по форуму:
panicwassano
05.02.2011, 17:54     Про указатели
  #20

Не по теме:

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

Yandex
Объявления
05.02.2011, 17:54     Про указатели
Ответ Создать тему
Опции темы

Текущее время: 00:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru