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

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

05.02.2011, 12:04. Просмотров 1961. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.02.2011, 12:04
Ответы с готовыми решениями:

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

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

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

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

30
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
43 / 41 / 2
Регистрация: 21.09.2009
Сообщений: 145
05.02.2011, 12:16 3
s = &x - в s содержится адресс x
*p=x; указатель становится равным 10 тоесть вы присваиваете указателю 10, не получив адресс со-но адресс у p будет отличный от s
0
1077 / 1003 / 106
Регистрация: 28.02.2010
Сообщений: 2,889
05.02.2011, 12:18 4
А можно знать с какой книги взят этот код? Он по идее не рабочий.

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

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

Добавлено через 2 минуты
Другое дело, удастся ли нам по этому адресу записать хоть что-нибудь.
1
2 / 2 / 2
Регистрация: 15.11.2009
Сообщений: 100
05.02.2011, 13:43 8
В таком виде он тоже рабочий .но так как написал
slavich, будет правильней
0
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
13 / 13 / 2
Регистрация: 25.10.2009
Сообщений: 32
05.02.2011, 16:19 10
Цитата Сообщение от no0ker Посмотреть сообщение
*p=a; // считаю неверным, только p=&a;
Почитайте про операцию * и указатели.
0
101 / 88 / 7
Регистрация: 17.12.2010
Сообщений: 416
05.02.2011, 16:21 11
повторюсь. как учебный (!) пример - он неприемлим. конечно, в том смысле - если вы знаете, что от него ждать, проблем нет. но если ждёте поведения обычного указателя - увы.
0
598 / 566 / 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
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
1077 / 1003 / 106
Регистрация: 28.02.2010
Сообщений: 2,889
05.02.2011, 16:58 14
Цитата Сообщение от Novij Посмотреть сообщение
Иными словами вот так все происходит???
Все верно.
0
598 / 566 / 104
Регистрация: 07.11.2010
Сообщений: 2,004
05.02.2011, 16:59 15
интересно зачем делать *p = x, когда это итак очевидно
0
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
4197 / 1790 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
05.02.2011, 17:46 17
Цитата Сообщение от DorianLeroy Посмотреть сообщение
*p = x -получаем адресс ячейки где хранится х;
Нет. В ячейку по адресу p копируем значение x.

Добавлено через 1 минуту
Цитата Сообщение от DorianLeroy Посмотреть сообщение
то есть по идее и в указателе р и в указателе s адресс ячейки х
Нет. Кто тебе сказал, что одно значение может быть только в одной ячейке?
0
598 / 566 / 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
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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