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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.69
v.a.l.i.d
413 / 378 / 10
Регистрация: 21.09.2012
Сообщений: 913
#1

Как узнать адрес указателя на char? - C++

04.10.2012, 20:26. Просмотров 2882. Ответов 9
Метки нет (Все метки)

Например, вот есть массив символов и указатель. И указателю присваиваем адрес этого массива. А как узнать адрес самого указателя?
C++
1
2
char animal[20] = "bear";
char *ps = animal;
Я пробовал что-то вроде этого делать, только ничего не получается. Он показывает адрес массива.
C++
1
cout << (int *)ps;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.10.2012, 20:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как узнать адрес указателя на char? (C++):

Как узнать адрес указателя? - C++
(void *)str показывает адрес строки, а как узнать адрес указателя? char *str = &quot;bla-bla-bla&quot;; cout &lt;&lt; &quot;Value of str is: &quot; &lt;&lt; str &lt;&lt;...

Узнать адрес указателя - C++
Есть функция в чужой программе, которая в качестве параметров принимает указатель на структуру. Вопрос, как узнать адрес этой структуры,...

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

Адрес объекта, адрес указателя. Где что находится? - C++
#include &lt;iostream&gt; void Foo(int* val) { std::cout &lt;&lt; val &lt;&lt; &quot; &quot; &lt;&lt; *val &lt;&lt; &quot; &quot; &lt;&lt; &amp;val &lt;&lt; '\n'; } void Bar(int* &amp;val) ...

Как сравнить два указателя типа char? - C++
char *p1; p1 = new char; p1 = &quot;qwert&quot;; char *p2; p2 = new char; p2 = &quot;zz&quot;; if(*p1==*p2) cout &lt;&lt; &quot;Равны! &quot;&lt;&lt; endl; ...

Как мне конвертировать адрес указателя (например 00A88B68) в тип string ? C++ - C++
вопрос в имени темы

9
severus-x
18 / 18 / 0
Регистрация: 21.09.2012
Сообщений: 78
04.10.2012, 20:29 #2
Имя массива будет указателем на первый элемент массива.
0
ProNoooob
74 / 74 / 6
Регистрация: 14.10.2009
Сообщений: 121
04.10.2012, 20:33 #3
Цитата Сообщение от V.A.L.I.D Посмотреть сообщение
А как узнать адрес самого указателя?
Операция взятия адреса вам поможет.

cout << &ps;
1
v.a.l.i.d
413 / 378 / 10
Регистрация: 21.09.2012
Сообщений: 913
04.10.2012, 20:43  [ТС] #4
Цитата Сообщение от ProNoooob Посмотреть сообщение
cout << &ps;
Да, это то, что надо. Спс
0
Evg
Эксперт CАвтор FAQ
18032 / 6264 / 427
Регистрация: 30.03.2009
Сообщений: 17,219
Записей в блоге: 27
05.10.2012, 14:18 #5
Цитата Сообщение от V.A.L.I.D Посмотреть сообщение
А как узнать адрес самого указателя?
Не много более развёрнутый ответ

C++
char **pps = &ps;
cout << pps;
1
AlexVBRB
0 / 0 / 0
Регистрация: 18.01.2014
Сообщений: 2
19.01.2014, 15:22 #6
Подниму старую тему.
Есть подобный вопрос, не имеющий практического смысла, но покоя не даёт.
Объявляю и определяю массив строк:
C++
1
char* arr[5] = {"One", "Two", "Three", "Four", "Five"};
Насколько я понимаю в данном случае иерархия получается следующая:
Как узнать адрес указателя на char?

И вот теперь как мне узнать:
Адрес указателя на массив указателей
Адрес первого указателя в массиве указателй
Адрес строки

При использовании printf мы получаем:
printf("%p",&arr); либо printf("%p",arr); - адрес первого указателя в массиве (значение указателя на массив указателей)
printf("%p",*arr); - адрес первой строки (значение первого указателя из массива указателей)

А если использовать cout:
cout<<arr; - адрес первого указателя в массиве
cout<<*arr; - содержимое первой строки.

Осталось понять как любым методом узнать адрес указателя на массив указателей.
А так же как узнавать все данные с помощью printf и cout. Я имею в виду как через printf получить содержимое строки а через cout её адрес.
В механизмах работы printf и cout не разбирался. Боюсь займёт целую вечность. Буду очень благодарен, если объясните на пальцах.
0
Evg
Эксперт CАвтор FAQ
18032 / 6264 / 427
Регистрация: 30.03.2009
Сообщений: 17,219
Записей в блоге: 27
19.01.2014, 15:36 #7
Цитата Сообщение от AlexVBRB Посмотреть сообщение
Насколько я понимаю в данном случае иерархия получается следующая
Нет, не такая. Самого левого столбика (состоящего из одного элемента) нету

Добавлено через 2 минуты
Цитата Сообщение от AlexVBRB Посмотреть сообщение
Осталось понять как любым методом узнать адрес указателя на массив указателей
Никак. Потому что такого указателя нету. Имя arr выступает в качестве разыменованного значения от такого указателя.

Добавлено через 29 секунд
Точнее, не "выступает в качестве", а "является эквивалентом"

Добавлено через 3 минуты
А если ты сделаешь

C
char **arr_p = arr;
&arr_p;
то получишь "адрес указателя на массив указателей", которого изначально в твоём примере не было

Добавлено через 1 минуту
Цитата Сообщение от AlexVBRB Посмотреть сообщение
Я имею в виду как через printf получить содержимое строки
C
#include <stdio.h>
 
char *str = "abc";
 
int main (void)
{
  printf ("%s\n", str); /* содержимое */
  printf ("%p\n", str); /* адрес */
  return 0;
}
Добавлено через 2 минуты
Ну и, может вот это чем-то поможет http://www.cyberforum.ru/blogs/18334/blog97.html
2
AlexVBRB
0 / 0 / 0
Регистрация: 18.01.2014
Сообщений: 2
19.01.2014, 16:23 #8
Значит в книге Лафоре информация не верна?
При передаче массива указателей в функцию он передаётся как char**. Вот эти две звёздочки сигнализируют о том, что передаётся массив указателей, а указателя на этот массив неявно, компилятором, не создаётся?
0
Evg
Эксперт CАвтор FAQ
18032 / 6264 / 427
Регистрация: 30.03.2009
Сообщений: 17,219
Записей в блоге: 27
19.01.2014, 17:21 #9
Цитата Сообщение от AlexVBRB Посмотреть сообщение
Значит в книге Лафоре информация не верна?
Не знаю, я ж книгу не читал и не знаю, что там написано

Цитата Сообщение от AlexVBRB Посмотреть сообщение
При передаче массива указателей в функцию он передаётся как char**. Вот эти две звёздочки сигнализируют о том, что передаётся массив указателей, а указателя на этот массив неявно, компилятором, не создаётся?
В функцию по сути дела передаётся &arr, который имеет тип char**. В твоём примере нигде не было явной переменной типа char**, её смысл выполнял "&arr", но в виде переменной такой величины не было. А при передаче параметра в функцию нужно же параметр как-то обозначать, вот у тебя и появляется такая переменная
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6503 / 3139 / 307
Регистрация: 04.12.2011
Сообщений: 8,661
Записей в блоге: 5
19.01.2014, 17:35 #10
Цитата Сообщение от AlexVBRB Посмотреть сообщение
Подниму старую тему.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//попробую объяснить ещё , иначе, (как сам представляю):
#include <iostream>
using namespace std;
 
int main(){
char *arr[]={"one", "two", "tree", "four", "five"};
//адресс массива (не указателя на массив, а самого массива)
//a) это просто, но не удобно в применении
void *adress_no_use_with_out_cast = (void *)&arr;
cout<<adress_no_use_with_out_cast<<endl;//адрес то есть, но что с ним делать? кроме как распечать?
//б) это лучше
char *(*ptr_arr_char)[5] = &arr;//а так и адрес есть и использовать можно
cout<<ptr_arr_char<<endl;
//и можно что-то сделать:
for (int i=0; i<5; ++i) cout << (*ptr_arr_char)[i]<<" ";
cout<<endl;
//по строкам уже сказали ведь.
char **ptr_to_first_str = &arr[0];
cout<<ptr_to_first_str<<endl;
cout<<*ptr_to_first_str<<endl;
//то есть адрес массива строк и адрес первой строки это одно и то же. 
//имея адрес первой строки и используя нуль-терминатор можно итерировать массив, зная размер))
 
//указатель на массив и строку, - разные вещи.
 
cin.get();
return 0;
}
1
19.01.2014, 17:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.01.2014, 17:35
Привет! Вот еще темы с ответами:

Как верно узнать размер указателя ? - C++
СBaseTest* pTest = { new СBaseTest, new СOther }; Нужно узнать размер pTest

Как узнать длину указателя (в байтах)? - C++
как узнать длину указателя(в байтах) sizeof(указатель)почему то не работает?

Как узнать текущее положение указателя файла? - C++
Как узнать текущее положение указателя файла в байтах?

Как получить адрес переменной типа unsigned char? - C++
Всем привет! Как получить адрес переменной типа unsigned char? Всё ерунда получается #include &lt;iostream&gt; using namespace std; ...


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

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

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