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

Различия указателей char* от указателей других типов

08.07.2016, 23:23. Просмотров 1085. Ответов 9
Метки нет (Все метки)

Помогите пожалуйста разобраться!
Прочитал раздел про указатели и даже вроде бы понял. Что касается указателей на тип int. Но что касается указателей на тип char - тут как то все по другому:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
char ar[80] = "Любая фраза";
char* p;
p = ar;
char **pp = &p;
cout << "p = " << p << endl; // по идее (и с указателями на int это действительно так) должен печатать 
// адрес, на который указывает р, но печатает фразу "Любая фраза"
cout << "*pp = " << *pp  << " - это должен был быть адрес указателя р"<< endl; // фиг там - печатает 
// "Любая фраза"
cout << "**pp = " << **pp << endl; //  печатает Л (первый элемент массива)
cout << "&p = " << &p << endl; // Я так понимаю это будет адрес, по которому находится указатель, 
// а не адрес на который  он указывает. А как же посмотреть именно адрес куда он  указывает??? 
// Понятно, что он совпадает с адресом первого элемента массива: cout << "ar = " << ar << endl;
// Но получается напрямую, как в указателях на int нельзя посмотреть?
 
    cout << "&ar[0] = " << &ar[0] << endl; // А вот тут самое загадочное - вместо адреса первого 
// элемента печатает всю фразу "Любая фраза". Почему ????? Ведь & - это взятие адреса!!!
    cout << "&ar[2] = " << &ar[2] << endl; // а так с третьего элемента массива  "бая фраза"....
Почему так?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.07.2016, 23:23
Ответы с готовыми решениями:

Объяснить различия в работе указателей на целое число и указателей на const char (строки в стиле Си)
Уважаемые программисты, возникло несколько вопросов касательно указателей. Почему при выводе...

Создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей
Задача: создать специфицированный шаблон функции, принимающей массив указателей на char и...

array char* to char* (значения массива указателей в один указатель)
Как сложить(или вывести в формате char*) все значения массива указателей(char *) воедино, то есть...

Почему у массивов типа char может быть утечка памяти, а у указателей char с выделенной памятью - нет?
Тут будет утечка памяти: #include&lt;iostream&gt; using namespace std; int main() { char name;...

9
Don't worry, be happy
16956 / 9833 / 1895
Регистрация: 27.09.2012
Сообщений: 24,383
Записей в блоге: 2
08.07.2016, 23:27 2
Лучший ответ Сообщение было отмечено SatanaXIII как решение

Решение

Цитата Сообщение от Курт78 Посмотреть сообщение
// по идее (и с указателями на int это действительно так) должен печатать
// адрес, на который указывает р, но печатает фразу "Любая фраза"
Просто operator<< для стандартных потоковых классов так перегружен,
что выводит все байты как символы, пока не встретит ноль.
Можете кастить указатель, например, к типу void*:
C++
1
cout << "p = " << (void*)p << endl;
1
0 / 0 / 0
Регистрация: 01.03.2015
Сообщений: 25
08.07.2016, 23:30  [ТС] 3
т.е. сам адрес, на который указывает указатель типа char посмотреть не получиться? только через имя массива?
0
Don't worry, be happy
16956 / 9833 / 1895
Регистрация: 27.09.2012
Сообщений: 24,383
Записей в блоге: 2
08.07.2016, 23:31 4
Цитата Сообщение от Курт78 Посмотреть сообщение
на который указывает указатель типа char посмотреть не получиться?
Кастите к void*, как у меня в посте(в посту?) и получите адрес, содержащийся в указателе.
1
0 / 0 / 0
Регистрация: 01.03.2015
Сообщений: 25
08.07.2016, 23:36  [ТС] 5
ага, понятно... сейчас попробую

Добавлено через 3 минуты
Получилось! Спасибо! А по поводу "финта" с взятием адреса элемента массива?
C++
1
2
cout << "&ar[0] = " << &ar[0] << endl; // А вот тут самое загадочное - вместо адреса первого 
// элемента печатает всю фразу "Любая фраза". Почему ????? Ведь & - это взятие адреса!!!
0
2700 / 1870 / 553
Регистрация: 05.06.2014
Сообщений: 5,420
08.07.2016, 23:40 6
Цитата Сообщение от Курт78 Посмотреть сообщение
Почему так?
Темное наследие Си, в котором указатель на char используется как (недо)строчка. std::string тогда еще не придумали.
1
0 / 0 / 0
Регистрация: 01.03.2015
Сообщений: 25
08.07.2016, 23:44  [ТС] 7
т.е. адрес от элемента массива типа char взять не получиться?

Добавлено через 1 минуту
или тоже как нибудь через void можно?
0
Don't worry, be happy
16956 / 9833 / 1895
Регистрация: 27.09.2012
Сообщений: 24,383
Записей в блоге: 2
08.07.2016, 23:44 8
Цитата Сообщение от Курт78 Посмотреть сообщение
А по поводу "финта" с взятием адреса элемента массива?
Тоже самое. Вы же получаете указатель на char'ы,
так что operator<< выводит всё, пока не уткнется в ноль.
Кастите также:
C++
1
cout << "&ar[0] = " << (void*)&ar[0] << endl;
1
2700 / 1870 / 553
Регистрация: 05.06.2014
Сообщений: 5,420
08.07.2016, 23:44 9
Цитата Сообщение от Курт78 Посмотреть сообщение
т.е. адрес от элемента массива типа char взять не получиться?
Получится. Просто, cout его печатать не будет без преобразования к void*.
1
0 / 0 / 0
Регистрация: 01.03.2015
Сообщений: 25
08.07.2016, 23:46  [ТС] 10
Все получилось. Еще раз спасибо.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.07.2016, 23:46

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Почему в сортировке указателей на объекты в вызове функции используются адреса объектов, а не указателей?
Доброго времени суток! Рассматриваю пример (из Лафоре) сортировки массива указателей на объекты,...

приведение типов указателей
Задача у меня простая. Нужно побитно оперировать с числом unsigned int и на каких-то этапах...

Объявление типов и указателей в C++
Доброго времени суток, есть код в Delphi, там следующая конструкция объявления типов: //...

Создать специализацию для шаблона, которая принимает массив указателей на строки и количество этих указателей
Нужно создать специализацию для шаблона, которая принимает массив указателей на строки и количество...

Как обойтись без указателей и указателей на указатель?
Ибо не совсем выходит понять,что на что тут указывает #include &quot;stdafx.h&quot; #include &lt;iostream&gt;...

Приведение типов умных указателей
Добрый день. Реализовал простенький умный указатель с подсчетом ссылок. template&lt;typename...


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

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

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