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

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

Войти
Регистрация
Восстановить пароль
 
Тамика
Котовчанин
870 / 450 / 143
Регистрация: 16.02.2010
Сообщений: 2,961
Записей в блоге: 27
#1

Если указатель хранит адрес ячейки памяти, на которую он указывает, то почему тогда в моем экспериментальном коде такой результат? - C++

22.01.2014, 17:28. Просмотров 433. Ответов 10
Метки нет (Все метки)

Добрый день! Вот второй день разбираюсь с указателями и ссылками, и всё равно не могу заполнить пробелы.
Объясните, пожалуйста. Если указатель хранит адрес ячейки памяти, на которую он указывает, то почему тогда в моем экспериментальном коде такой результат? Заранее спасибо!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <iostream>
#define N 5
void main(void)
{
    int p = 4;
 
    int *pointer;
    pointer = &p;
 
    pointer += 1;
    std::cout << "pointer += 1" << std::endl;
    std::cout << "cout pointer " << pointer << std::endl;
    std::cout << "cout &pointer" <<&pointer << std::endl;
 
    *pointer += 1;
    std::cout << "*pointer += 1" << std::endl;
    std::cout << "cout pointer " << pointer << std::endl;
    std::cout << "cout &pointer" <<&pointer << std::endl;   
}
Результат

pointer += 1
cout pointer 003AF80C
cout &pointer003AF7F0
*pointer += 1
cout pointer 003AF80C
cout &pointer003AF7F0

Почему в первом варианте адрес ячейки не изменился? Я ведь увеличила его на единицу.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.01.2014, 17:28
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Если указатель хранит адрес ячейки памяти, на которую он указывает, то почему тогда в моем экспериментальном коде такой результат? (C++):

В какой области памяти хранится указатель (сама переменная, которая хранит адрес)? - C++
Привет! В общем у меня возник небольшой вопрос :) Если мы объявляем указатель, выделяем ему память, то память выделяется в куче, а адрес...

На какой адрес указывает указатель? - C++/CLI
Добрый день ! Подскажите пожалуйста , почему при такой записи от компилятора не получаю ошибку ? value class Message { ...

На какую область памяти указывает адрес недоступной памяти - Assembler
Здравствуйте! Написал программу, выводит (из PSP) сегментный адрес первого байта недоступной памяти, адрес среды, передаваемой программе,...

Получить адрес ячейки которую находит формула ВПР - VBA
На листе &quot;Посетительские стулья&quot; таблица с ценами, при двойном клике по ячейки необходимо заполнить товары из листа &quot;Справочник&quot; в лист...

Удаление памяти, на которую ссылается указатель - C++
Всем привет. Такой вопрос, что станет с указателем на объект, если этот объект удалить через delete? У меня есть пользовательский класс...

Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? - C++
Скажем я в какой-то момент выделяю память под массив: int *a = new int ; затем память может изменяться как-то и конечный размер мне не...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Croessmah
Модератор
Эксперт CЭксперт С++
13134 / 7397 / 828
Регистрация: 27.09.2012
Сообщений: 18,227
Записей в блоге: 3
Завершенные тесты: 1
22.01.2014, 17:31 #2
Цитата Сообщение от Тамика Посмотреть сообщение
Почему в первом варианте адрес ячейки не изменился?
кто Вам это сказал? Выведите адрес до присваивания единицы
C++
1
*pointer += 1
а такое уже может плохо кончиться
Тамика
Котовчанин
870 / 450 / 143
Регистрация: 16.02.2010
Сообщений: 2,961
Записей в блоге: 27
22.01.2014, 17:34  [ТС] #3
И как всегда - только запостила тему, сразу и поняла что к чему.

Добавлено через 1 минуту
Цитата Сообщение от Croessmah Посмотреть сообщение
а такое уже может плохо кончиться
А почему? Разыменовала указатель и значение увеличила на единицу... Или нет?
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.01.2014, 17:36 #4
C++
1
2
3
4
5
6
7
8
9
10
int p = 4;
 
    int *pointer;
    pointer = &p;
    
    std::cout << "pointer" << pointer << std::endl;
    pointer += 1;
    std::cout << "pointer += 1" << std::endl;
    std::cout << "cout pointer " << pointer << std::endl;
    std::cout << "cout &pointer" <<&pointer << std::endl;
pointer0012FF60
pointer += 1
cout pointer 0012FF64
cout &pointer0012FF54
Ev[G]eN
Эксперт С++
5097 / 1535 / 381
Регистрация: 23.01.2011
Сообщений: 3,148
22.01.2014, 17:37 #5
Тамика, он наверное имел ввиду
C++
1
pointer += 1;
Тамика
Котовчанин
870 / 450 / 143
Регистрация: 16.02.2010
Сообщений: 2,961
Записей в блоге: 27
22.01.2014, 17:40  [ТС] #6
Цитата Сообщение от Ev[G]eN Посмотреть сообщение
Тамика, он наверное имел ввиду
C++
1
pointer += 1;
Если так, то вопрос упрощается до "А почему?"
Ev[G]eN
Эксперт С++
5097 / 1535 / 381
Регистрация: 23.01.2011
Сообщений: 3,148
22.01.2014, 17:42 #7
потому, что вы ссылаете его на неизвестную ячейку памяти, которая может отвечать за какой-то системный файл(ну, к примеру), а это опасно, я думаю по понятным причинам
Croessmah
Модератор
Эксперт CЭксперт С++
13134 / 7397 / 828
Регистрация: 27.09.2012
Сообщений: 18,227
Записей в блоге: 3
Завершенные тесты: 1
22.01.2014, 17:44 #8
Цитата Сообщение от Тамика Посмотреть сообщение
Разыменовала указатель и значение увеличила на единицу... Или нет?
так и есть, только вот у Вас был адрес переменной p, вы "шагнули" в памяти вперед на sizeof(p) байт и что там лежит не понятно, так что присваивая туда что-то Вы портите данные программы, хорошо если программа упадет и Вы об этом узнаете, а если нет?
Тамика
Котовчанин
870 / 450 / 143
Регистрация: 16.02.2010
Сообщений: 2,961
Записей в блоге: 27
22.01.2014, 17:46  [ТС] #9
Ага, с этим понятно, спасибо!
Получается, что в коде
C++
1
2
3
4
int var = 10;
 
int& a = var;
int* pointer = &var;
значение a и *pointer - будут одинаковы? То есть - оба они будут ссылаться на var?
Ev[G]eN
Эксперт С++
5097 / 1535 / 381
Регистрация: 23.01.2011
Сообщений: 3,148
22.01.2014, 17:48 #10
Цитата Сообщение от Тамика Посмотреть сообщение
значение a и *pointer - будут одинаковы?
конечно

Добавлено через 41 секунду
Цитата Сообщение от Тамика Посмотреть сообщение
То есть - оба они будут ссылаться на var?
да..
Тамика
Котовчанин
870 / 450 / 143
Регистрация: 16.02.2010
Сообщений: 2,961
Записей в блоге: 27
22.01.2014, 17:49  [ТС] #11
Прозрение наступило! Всем большое спасибо за то, что отозвались! Очень помогли
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.01.2014, 17:49
Привет! Вот еще темы с ответами:

Получить адрес памяти, на который ссылается указатель - C++
Изучаю указатели, появился такой вопрос: int *b = new int(5); Как получить адрес памяти, на который ссылается указатель b? То есть...

Почему такой результат? - Java SE
public class Ref { public static void main(String args) { int m = 5; int n = 6; ...

Почему такой результат - C#
int x = 90; x &amp;= 50; Console.WriteLine(x); Объясните пожалуйста почему здесь такой результат 18 Как я...

Значение ячейки памяти через указатель - Visual C++
Хочу узнать значения ячеек памяти на определенном участке. Для этого пробую задать указателю адрес конкретной ячейки в памяти в hex виде,...


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

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

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