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

Как вывести адресс на который указывает указатель типа char*. - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 27, средняя оценка - 4.78
antifaton
0 / 0 / 0
Регистрация: 12.10.2011
Сообщений: 7
12.10.2011, 18:45     Как вывести адресс на который указывает указатель типа char*. #1
Эта программа :
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;
 
int main()
{
int a[]={1, 2, 3, 4};
int* g=a;
cout<<g<<endl;
g++;
cout<<g<<endl;
return 0;
}
выводит :
0xbff1502c
0xbff15030
Тут все понятно, указателю g присваивается адрес первого элемента массива а. Без разименовывания получаем адрес элемента.
Но если :
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;
 
int main()
{
char a[]={'1', '2', '3', '4'};
char* g=a;
cout<<g<<endl;
g++;
cout<<g<<endl;
return 0;
}
То на выходе получаем:
1234
234
Тоесть не адреса а данные лежащие по этим адресам, при чем даже не конкретно элемент лежащий по адресу, а весь массив, начиная с текущего адреса.
Почему??? Как получить сам адресс?

 Комментарий модератора 
Используйте теги форматирования кода!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.10.2011, 18:45     Как вывести адресс на который указывает указатель типа char*.
Посмотрите здесь:

Создать указатель, который сможет указывать объект любого типа. C++
Строка: Как расположить буквы в первом массиве, который типа char, в порядке убывания или возрастания частоты появления букв в тексте? C++
Аргумент типа char (*)[1000] несовместим с параметром типа char** C++
C++ Указатель на поле типа char []
Как изменить тип объекта, на который указывает указатель? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
HighPredator
 Аватар для HighPredator
5350 / 1733 / 320
Регистрация: 10.12.2010
Сообщений: 5,120
Записей в блоге: 3
12.10.2011, 18:54     Как вывести адресс на который указывает указатель типа char*. #2
Унарный оператор '&' возвращает адрес памяти по которому расположен его операнд.
Ree.exe
56 / 56 / 4
Регистрация: 01.08.2011
Сообщений: 141
12.10.2011, 18:54     Как вывести адресс на который указывает указатель типа char*. #3
вроде бы вот так->
C++
1
2
3
4
5
6
7
8
9
10
11
#include<iostream>
using namespace std;
 
int main()
{
char *f="fjlkfj";
cout<<f<<endl;
void* a=&f;
cout<<a;
 
}

Не по теме:

вот маленький пример.

HighPredator
 Аватар для HighPredator
5350 / 1733 / 320
Регистрация: 10.12.2010
Сообщений: 5,120
Записей в блоге: 3
12.10.2011, 18:54     Как вывести адресс на который указывает указатель типа char*. #4
Для последнего примера:
C++
1
cout<<&a<<endl;
antifaton
0 / 0 / 0
Регистрация: 12.10.2011
Сообщений: 7
12.10.2011, 20:36  [ТС]     Как вывести адресс на который указывает указатель типа char*. #5
cout<<&a<<endl;
при такой записи мы получим адресс самого указателя, а не его содержимого, тоесть если сделать а++, и повторить вывод cout<<&a<<endl; , получим тот же адрес.

А что бы манипулировать адресом ( и при этом иметь возможность эго "увидеть") с помощью приведенного выше примера:

C++
1
2
3
4
5
6
7
8
9
10
11
12
#include<iostream>
using namespace std;
 
int main()
{
char *f="fjlkfj";
cout<<f<<endl;
void* a=&f;
cout<<&a<<endl;
f++;
cout<<a<<endl;
}
Вывод:
fjlkfj
0xbfe73748
0xbfe7374c
Но как-то это громоздко, создавать один указатель, потом указатель на этот указатель и при этом увеличивать адрес первого указателя... проще никак?

Добавлено через 1 час 14 минут
И все таки почему же с int все просто получается, а с char еще поколдовать нужно? Чем это вызвано?
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
12.10.2011, 20:42     Как вывести адресс на который указывает указатель типа char*. #6
Тем, что операция << перегружена для типа char*, а для int* нет.
C++
1
2
3
4
5
6
7
8
#include <iostream>
int main()
{
     char a[] = "1234";
     std::cout << (void*)a;
     system( "pause" );
    return 0;
}
HighPredator
 Аватар для HighPredator
5350 / 1733 / 320
Регистрация: 10.12.2010
Сообщений: 5,120
Записей в блоге: 3
12.10.2011, 20:50     Как вывести адресс на который указывает указатель типа char*. #7
Цитата Сообщение от antifaton Посмотреть сообщение
cout<<&a<<endl;
при такой записи мы получим адресс самого указателя
1) Мой компилятор мне сказал, что "а" ни разу не указатель. Соответственно мы получили адрес содержимого.
Цитата Сообщение от antifaton Посмотреть сообщение
тоесть если сделать а++
2) Соответственно это тоже не пройдет.
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,585
Записей в блоге: 12
12.10.2011, 21:02     Как вывести адресс на который указывает указатель типа char*. #8
Цитата Сообщение от antifaton Посмотреть сообщение
И все таки почему же с int все просто получается, а с char еще поколдовать нужно? Чем это вызвано?
ну как с инт просто

int a;
cout < a // выведет четыре байта начинающихся от начала инт
char s;
cout < s // выведет один байт начинающийся от начала чаир

Добавлено через 1 минуту
int a[10];
cout < a[1] // выведет четыре байта начинающихся от начала инт+1
char s[10];
cout < s[1] // выведет один байт начинающийся от начала чаир+1
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
12.10.2011, 21:45     Как вывести адресс на который указывает указатель типа char*. #9
Van111
Чушь какую-то написали. Да и где указатели?
antifaton
0 / 0 / 0
Регистрация: 12.10.2011
Сообщений: 7
12.10.2011, 23:45  [ТС]     Как вывести адресс на который указывает указатель типа char*. #10
Цитата Сообщение от Predator_2004 Посмотреть сообщение
1) Мой компилятор мне сказал, что "а" ни разу не указатель. Соответственно мы получили адрес содержимого..
void* a=&f; Это же синтаксис объявления указателя неопределенного типа , разве не так?
И, кстати этот пример совсем не рабочий,
C++
1
2
3
4
5
6
7
8
9
10
11
#include<iostream>
using namespace std;
 
int main()
{
char *f="fjlkfj";
cout<<f<<endl;
void* a=&f;
cout<<&a;
 
}
Данные "fjlkfj" лежат по адресу, который присвоен "f", а &f это адрес самого указателя, следовательно в той строке void* a=&f; амперсанд лишний. И если немного доработать этот код :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main()
{
char *f="fjlkfj";
void* a=f;
cout<<(char*)a<<endl;//так как тип "а" неопределенный, то его нужно указывать явно
cout<<a<<endl;
a=(char*)a+1;
cout<<(char*)a<<endl;
cout<<a<<endl;
 
 
getchar();
return 0;
}
То таки получим на выходе:
fjlkfj
00C57800
jlkfj
00C57801
Но только почему то команда cout<<(char*)a; выводит не текущий элемент, а весь массик начиная с текущего элемента. Это не совсем то чего хотелосб.

Так же я проанализировал пример Chelioss-а, и он мне показался наиболее приемлемым:
C++
1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
     char a[] = "1234";
     char *b=a;
     std::cout<<(void*)b<<endl;
     std::cout<<*b<<endl;
     b++;
     std::cout<<(void*)b<<endl;
     std::cout<<*b<<endl;
     getchar();
    return 0;
}
Вывод:
0014FD84
1
0014FD85
2
Вот, в принципе , этого я и добивался. Большое спасибо за помощ .
HighPredator
 Аватар для HighPredator
5350 / 1733 / 320
Регистрация: 10.12.2010
Сообщений: 5,120
Записей в блоге: 3
13.10.2011, 00:04     Как вывести адресс на который указывает указатель типа char*. #11
antifaton, Видимо вы не поняли про что я. Вот ваш код:
C++
1
char a[]={'1', '2', '3', '4'};
Так вот сама по себе переменная 'a' никакой не указатель. Она имеет тип не char*, а const char 4. Из этого вытекает, что операция a++ не будет выполнена, тк ей нужен l-value, каковой данная переменная не является.
P.S. это написано в связи с топиком и вашим постом.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
13.10.2011, 00:11     Как вывести адресс на который указывает указатель типа char*. #12
Цитата Сообщение от antifaton Посмотреть сообщение
Но только почему то команда cout<<(char*)a; выводит не текущий элемент, а весь массик начиная с текущего элемента. Это не совсем то чего хотелосб.
Потому что так перегружена операция << для char*.
antifaton
0 / 0 / 0
Регистрация: 12.10.2011
Сообщений: 7
13.10.2011, 00:56  [ТС]     Как вывести адресс на который указывает указатель типа char*. #13
Predator_2004, прошу прощения, я не правильно понял ваш первый комментарий, теперь все предельно ясно.
Chelioss, спасибо, теперь понятно как с этим бороться.
Еще раз всем спасибо, вы полностью просветили меня в моем вопросе.
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,585
Записей в блоге: 12
13.10.2011, 16:26     Как вывести адресс на который указывает указатель типа char*. #14
Цитата Сообщение от Chelioss Посмотреть сообщение
Van111
Чушь какую-то написали. Да и где указатели?
cout << i[1] /можно так
а можно так
cout << *(i+1)
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
13.10.2011, 17:36     Как вывести адресс на который указывает указатель типа char*. #15
Цитата Сообщение от Van111 Посмотреть сообщение
cout << i[1] /можно так
а можно так
cout << *(i+1)
Ну и как это относится к теме? У вас выводится значения i элемента, а вопрос состоял в том, как вывести адрес строки.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.10.2011, 17:40     Как вывести адресс на который указывает указатель типа char*.
Еще ссылки по теме:

C++ Вывести с помощью printf переменную типа char*
array char* to char* (значения массива указателей в один указатель) C++
Сохранение/Загрузка указателя на указатель типа char C++

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

Или воспользуйтесь поиском по форуму:
Nameless One
Эксперт С++
 Аватар для Nameless One
5754 / 3403 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
13.10.2011, 17:40     Как вывести адресс на который указывает указатель типа char*. #16
C
1
2
char buf[] = /* bla-bla-bla */;
printf("0x%07x\n", buf);
Yandex
Объявления
13.10.2011, 17:40     Как вывести адресс на который указывает указатель типа char*.
Ответ Создать тему
Опции темы

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