Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 27, средняя оценка - 4.78
antifaton
0 / 0 / 0
Регистрация: 12.10.2011
Сообщений: 7
#1

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

12.10.2011, 18:45. Просмотров 4503. Ответов 15
Метки нет (Все метки)

Эта программа :
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
Тоесть не адреса а данные лежащие по этим адресам, при чем даже не конкретно элемент лежащий по адресу, а весь массив, начиная с текущего адреса.
Почему??? Как получить сам адресс?

 Комментарий модератора 
Используйте теги форматирования кода!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.10.2011, 18:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как вывести адресс на который указывает указатель типа char*. (C++):

Как создать копию объекта на который указывает указатель - C++
У меня есть указатель класс Student, который хранит информацию о студентах(имя, фамилию, телефон) в строках в стиле Си, то есть private...

Как изменить тип объекта, на который указывает указатель? - C++
Есть абстрактный базовый класс и два производных: class Base { protected: int A; }; class Child1 : public Base {

Указатель не указывает на CHAR - C++
Доброго всем здравия, совсем запутался, написал примитивный код, а он гад не работает. Как такое возможно? #include &quot;stdafx.h&quot; ...

Узнать номер элемента массива на который указывает указатель - C++
Может вопрос глупый но тока что об этом задумался! Можно ли узнать номер элемента массива на который указывает указатель не используя...

Указатель на поле типа char [] - C++
Всем добрый день! Ситуация такая: есть класс, в нём есть поля типа char и метод, работающий с этими полями. Метод должен многократно по...

Сохранение/Загрузка указателя на указатель типа char - C++
char **data = new char*; Подскажите, пожалуйста, как записать содержимое всего выше написанного в файл в двоичном виде, а также,...

15
HighPredator
5560 / 1873 / 350
Регистрация: 10.12.2010
Сообщений: 5,487
Записей в блоге: 3
12.10.2011, 18:54 #2
Унарный оператор '&' возвращает адрес памяти по которому расположен его операнд.
0
Ree.exe
56 / 56 / 4
Регистрация: 01.08.2011
Сообщений: 141
12.10.2011, 18:54 #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;
 
}

Не по теме:

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

0
HighPredator
5560 / 1873 / 350
Регистрация: 10.12.2010
Сообщений: 5,487
Записей в блоге: 3
12.10.2011, 18:54 #4
Для последнего примера:
C++
1
cout<<&a<<endl;
0
antifaton
0 / 0 / 0
Регистрация: 12.10.2011
Сообщений: 7
12.10.2011, 20:36  [ТС] #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 еще поколдовать нужно? Чем это вызвано?
0
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,134
12.10.2011, 20:42 #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;
}
2
HighPredator
5560 / 1873 / 350
Регистрация: 10.12.2010
Сообщений: 5,487
Записей в блоге: 3
12.10.2011, 20:50 #7
Цитата Сообщение от antifaton Посмотреть сообщение
cout<<&a<<endl;
при такой записи мы получим адресс самого указателя
1) Мой компилятор мне сказал, что "а" ни разу не указатель. Соответственно мы получили адрес содержимого.
Цитата Сообщение от antifaton Посмотреть сообщение
тоесть если сделать а++
2) Соответственно это тоже не пройдет.
0
Van111
210 / 189 / 4
Регистрация: 03.08.2011
Сообщений: 2,598
Записей в блоге: 12
12.10.2011, 21:02 #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
0
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,134
12.10.2011, 21:45 #9
Van111
Чушь какую-то написали. Да и где указатели?
0
antifaton
0 / 0 / 0
Регистрация: 12.10.2011
Сообщений: 7
12.10.2011, 23:45  [ТС] #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
Вот, в принципе , этого я и добивался. Большое спасибо за помощ .
0
HighPredator
5560 / 1873 / 350
Регистрация: 10.12.2010
Сообщений: 5,487
Записей в блоге: 3
13.10.2011, 00:04 #11
antifaton, Видимо вы не поняли про что я. Вот ваш код:
C++
1
char a[]={'1', '2', '3', '4'};
Так вот сама по себе переменная 'a' никакой не указатель. Она имеет тип не char*, а const char 4. Из этого вытекает, что операция a++ не будет выполнена, тк ей нужен l-value, каковой данная переменная не является.
P.S. это написано в связи с топиком и вашим постом.
0
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,134
13.10.2011, 00:11 #12
Цитата Сообщение от antifaton Посмотреть сообщение
Но только почему то команда cout<<(char*)a; выводит не текущий элемент, а весь массик начиная с текущего элемента. Это не совсем то чего хотелосб.
Потому что так перегружена операция << для char*.
0
antifaton
0 / 0 / 0
Регистрация: 12.10.2011
Сообщений: 7
13.10.2011, 00:56  [ТС] #13
Predator_2004, прошу прощения, я не правильно понял ваш первый комментарий, теперь все предельно ясно.
Chelioss, спасибо, теперь понятно как с этим бороться.
Еще раз всем спасибо, вы полностью просветили меня в моем вопросе.
0
Van111
210 / 189 / 4
Регистрация: 03.08.2011
Сообщений: 2,598
Записей в блоге: 12
13.10.2011, 16:26 #14
Цитата Сообщение от Chelioss Посмотреть сообщение
Van111
Чушь какую-то написали. Да и где указатели?
cout << i[1] /можно так
а можно так
cout << *(i+1)
0
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,134
13.10.2011, 17:36 #15
Цитата Сообщение от Van111 Посмотреть сообщение
cout << i[1] /можно так
а можно так
cout << *(i+1)
Ну и как это относится к теме? У вас выводится значения i элемента, а вопрос состоял в том, как вывести адрес строки.
0
13.10.2011, 17:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.10.2011, 17:36
Привет! Вот еще темы с ответами:

Строка: Как расположить буквы в первом массиве, который типа char, в порядке убывания или возрастания частоты появления букв в тексте? - C++
Имеется два массива. Один типа char из 26 букв алфавита в алфавитном порядке, другой -- типа int из 26 элементов, в которых соответственно...

Создать указатель, который сможет указывать объект любого типа. - C++
Привет всем, я в програмировании ни чего не смыслю поэтому обращаюсь к вам, помогите составить программу, желательно для Visual studio 10....

Аргумент типа char (*)[1000] несовместим с параметром типа char** - C++
Здравствуйте! Есть вот такая структура: #define max 1000 struct expr { char s; int index; };

Аргумент типа char** не совместим с параметром типа const char* - C++
Программа должна позволять заносить в структуру данные и выводить на экран информацию о поездах, следующих до определенной станции: ...


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

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

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