Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 15 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 13.05.2013, 14:16   #1
_KUL
Форумчанин
 
Регистрация: 12.03.2011
Сообщений: 96
Репутация: 2
Вопрос Присвоить Указателю адрес из массива Char

Например есть такой код:
Код:
#include <iostream>

using namespace std;

int main()
{
    int a = 123456789;
    int *sa = &a;
    char b[7];
    cout << sa << " - ";
    cout << ++sa <<  endl;
    cin >> b;
    cout << "b , address - " << &b << " Value - "<< b << endl;
    sa = (int*)b;
    cout << sa;
    return 0;
}
Почему указателю sa присваивается адрес переменной b, а не её содержимое?
Т.е. если я сделаю sa = (int*)0x28ffa1; то sa будет ссылаться на адрес. А если я хочу, чтобы пользователь с клавиатуры ввёл адрес куда должен ссылаться указатель?

Суть интереса в том, чтобы посмотреть что в тех байтах, которые хранят int переменной a. Проблема в том, что умный язык С++ при действии sa++ увеличит адрес на 4 байта, а хочется на 1 и посмотреть что в этой ячейки.

Последний раз редактировалось Stilet; 14.05.2013 в 21:24.
_KUL вне форума   Ответить с цитированием
Старый 14.05.2013, 17:59   #2
MoBLer
Форумчанин
 
Аватар для MoBLer
 
Регистрация: 30.12.2010
Сообщений: 91
Репутация: 18
По умолчанию

Так просто доступ к памяти вы не получите, вот статья на хабр, она должна помочь
__________________
Я тебе помог, добавь отзыв)))))
Статьи по программированию
MoBLer вне форума   Ответить с цитированием
Старый 14.05.2013, 18:22   #3
Abstraction
Профессионал
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
Репутация: 655
По умолчанию

Цитата:
Проблема в том, что умный язык С++ при действии sa++ увеличит адрес на 4 байта, а хочется на 1 и посмотреть что в этой ячейки.
Если это действительно проблема (хотя не понимаю, почему), то
Код:
char* pmem = (char*) sa;
cout << (int)pmem[0] << (int)pmem[1] << (int)pmem[2] << (int)pmem[3];
Цитата:
Почему указателю sa присваивается адрес переменной b, а не её содержимое?
Потому что b автоматически приводится от char[] к char*. В итоге в sa имеете указатель на начало массива b.
Abstraction вне форума   Ответить с цитированием
Старый 14.05.2013, 19:32   #4
RussDragon
Форумчанин
 
Аватар для RussDragon
 
Регистрация: 07.04.2012
Сообщений: 216
Репутация: 20
По умолчанию

С++ прибавляет +4 только на 32 разрядной системе вроде бы, а на 64 она прибавляет все как надо.
RussDragon вне форума   Ответить с цитированием
Старый 14.05.2013, 19:49   #5
pproger
C++ hater
СуперМодератор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,317
Репутация: 1437

skype: vvviperrr00
По умолчанию

Цитата:
Сообщение от RussDragon Посмотреть сообщение
С++ прибавляет +4 только на 32 разрядной системе вроде бы, а на 64 она прибавляет все как надо.
что как надо? и там и там размер типа int одинаков, и там и там к указателю на инт при инкременте прибавится 4 байта
__________________
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума   Ответить с цитированием
Старый 14.05.2013, 19:53   #6
RussDragon
Форумчанин
 
Аватар для RussDragon
 
Регистрация: 07.04.2012
Сообщений: 216
Репутация: 20
По умолчанию

Значит я что-то путаю.

- Шилдт
RussDragon вне форума   Ответить с цитированием
Старый 14.05.2013, 20:00   #7
pproger
C++ hater
СуперМодератор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,317
Репутация: 1437

skype: vvviperrr00
По умолчанию

2RussDragon
ну и что? это как-то опровергает мой камент или подтверждает твой?) а если ни то, ни другое, то зачем ты это приводишь?
__________________
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума   Ответить с цитированием
Старый 14.05.2013, 20:12   #8
RussDragon
Форумчанин
 
Аватар для RussDragon
 
Регистрация: 07.04.2012
Сообщений: 216
Репутация: 20
По умолчанию

Ладно. Я возможно не так понял автора, ухожу.
RussDragon вне форума   Ответить с цитированием
Старый 14.05.2013, 20:24   #9
BDA
Модератор
Заслуженный модератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Адрес: RF Moscow
Сообщений: 5,406
Репутация: 2502

icq: 438888048
По умолчанию

Целое (тип данных)
Цитата:
Многие языки программирования предлагают выбор между короткими (англ. short), длинными (англ. long) и целыми стандартной длины. Длина стандартного целого типа, как правило, совпадает с размером машинного слова на целевой платформе. Для 16-разрядных операционных систем — этот тип (int) составляет 2 байта и совпадает с типом short int (можно использовать как short, опуская слово int), для 32-разрядных операционных систем он будет равен 4 байтам и совпадает с длинным целым long int (можно использовать как long, опуская слово int), и в этом случае будет составлять 4 байта. Короткое целое short int, для 16-разрядных операционных систем, 32-разрядных операционных систем, и для большинства 64-разрядных операционных систем составляет — 2 байта. Также в некоторых языках может использоваться тип данных двойное длинное long long, который составляет 8 байт.
Для 64-разрядных операционных систем учитывая разность моделей данных (LP64, LLP64, ILP64), представление целого типа на разных моделях данных может отличаться между собой. Тип int и long может составлять как 4, так и 8 байт.
__________________
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума   Ответить с цитированием
Старый 16.05.2013, 04:28   #10
_KUL
Форумчанин
 
Регистрация: 12.03.2011
Сообщений: 96
Репутация: 2
По умолчанию

В принципе все просто было, главное вдумчиво подумать над приведением типов
http://www.cyberforum.ru/cpp-beginne...ead864314.html
_KUL вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Узнать id элемента массива по указателю WildTaburet Общие вопросы C/C++ 2 08.10.2012 14:21
Как присвоить адрес массиву? VintProg Общие вопросы C/C++ 20 28.10.2011 14:27
Не могу присвоить адрес? VintProg Общие вопросы C/C++ 11 17.06.2011 05:55
Как передать адрес метода из dll в приложение и присвоить его событию OnClick? puga555 Общие вопросы Delphi 1 22.12.2009 18:04
Передача массива по указателю liver1981 Общие вопросы C/C++ 3 21.04.2009 17:07


03:43.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.