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

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

Войти
Регистрация
Восстановить пароль
 
IvanInanovich
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 113
#1

pointer - pointer - C++

02.06.2013, 21:51. Просмотров 464. Ответов 6
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<iostream>
#include<algorithm>
using namespace std;
 
int main()
{
 
    int arr[] = {8,4,6,15,36,78,9,10};
    int *ptr;
    ptr = find(arr,arr+8,15);
    cout << *arr << endl;
    cout << "\nFirst object with value 33 found at offset: " << (ptr - arr) ;
 
return 0;
}
Объясните пожалуйста, как в данном случае указатель минусуется указателем(ptr - arr). Просим алгоритм find найти число 15. В ptr хранится позиция 3(с 0) элемента массива. Указатель arr (тобишь начало массива, 0 позиция). Каким образом это работает?

Добавлено через 6 часов 38 минут
Ребят, помогите разобраться.
Голову сломал пока пытался понять. Печально то, что так и не дошло до меня.

К примеру, указатель имеет адрес массива + смещен на 5 позицию(учитывая нуль). Каждая позиция это 4 байта (в случае типа int). Массив из 8 элементов = 32 байта.
По идее происходит следующее:
0х46е010(массив + смещение) - 0х46е000 (адрес массива) = 0х000010. (Адреса взяты из своего ПК.)
Остается 10. Каким образом программа показывает 5 элемент массива?

Если я правильно понимаю,то 10, это 10 бит, т.е. 2.5 элемента массива int.

Полез я наверное куда не следовало и запутался окончательно. : ) Жаль что автор книги оставил без внимания этот момент.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.06.2013, 21:51     pointer - pointer
Посмотрите здесь:

Pointer. Int * - C++
Создать функцию, которая находит максимальное значение из int *a pointer (подсказка: используйте *a pointer как динамичный массив, также...

Pointer. Char* - C++
Создать программу, которая перемещает каждую букву на заданное количество по алфавиту. Ввод: char *slovo, int chislo. (например, &quot;zima&quot;,...

Null pointer - C++
void C_StringBit :: setStrBit() { char* ptr1; cout &lt;&lt; &quot;Введите строку&quot;&lt;&lt; endl; cin &gt;&gt; ptr1; lengthBit = strlen(ptr1); ...

Smart pointer - C++
Доброго времени суток. Вопросы мои связаны с началом изучения умных указателей в C++ и применении в проектах. Взял за начало...

smart pointer с указателем на new[] - C++
Как я понимаю, реализация shared_ptr boost или tr1 подразумевает, что в неё будет передан одиночный объект, который будет удален через...

Свой auto pointer - C++
Есть учебное задание: Реализовать шаблонный класс auto_ptr. Прошу подсказать все ли идейно правильно написано. Что стоит исправить и...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
02.06.2013, 21:57     pointer - pointer #2
Цитата Сообщение от IvanInanovich Посмотреть сообщение
К примеру, указатель имеет адрес массива + смещен на 5 позицию(учитывая нуль). Каждая позиция это 4 байта (в случае типа int).
Цитата Сообщение от IvanInanovich Посмотреть сообщение
0х46е010(массив + смещение) - 0х46е000 (адрес массива) = 0х000010.
ну так 5-я позиция это:
((адрес массива + смещение) - адрес массива)
((0х46е000 + 5 * 4) - 0х46е000) = 20 байт это 4 инта
NoMasters
Псевдослучайный
1747 / 1090 / 71
Регистрация: 13.09.2011
Сообщений: 3,120
02.06.2013, 21:59     pointer - pointer #3
Результатом вычитания указателей будет количество элементов соответствующего типа между ними. А память таки адресуется по байтам, а не по битам.
IvanInanovich
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 113
02.06.2013, 22:37  [ТС]     pointer - pointer #4
Спасибо Jupiter. Единственный момент для меня не понятен.
((0х46е000 + 5 * 4) - 0х46е000) = 20 байт это 4 инта

А мой ПК показывает адреса:
0х46е010 - 0х46е000 = 10 байт. Хотя указатель стоит на 5 элементе массива.


NoMasters, перечитал свое сообщение. Вижу что написал про биты, а считал байты. Мозги отказываются нормально работать)) Спасибо вам.
BAADF00D
Заблокирован
02.06.2013, 22:50     pointer - pointer #5
Цитата Сообщение от IvanInanovich Посмотреть сообщение
20 байт это 4 инта
вообще -- то 4 инта == 16 байт. И то не факт.

Цитата Сообщение от IvanInanovich Посмотреть сообщение
0х46е010 - 0х46е000 = 10 байт
Равно не 10 байт, а 0x10 == 16 байт.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
02.06.2013, 22:53     pointer - pointer #6
20 байт это 4 инта
Цитата Сообщение от BAADF00D Посмотреть сообщение
вообще -- то 4 инта == 16 байт. И то не факт.
пардон, конечно же 5.
если без экзотики - факт
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.06.2013, 22:59     pointer - pointer
Еще ссылки по теме:

Invalid pointer operation - C++
Добрый вечер. Возникает такая ошибка при выключении программы: invalid pointer operation. Используется DLL. extern &quot;C&quot;...

Null pointer assignment. - C++
Здравствуйте. Такая проблема: Пытаюсь вызвать функция класса Up() s2 = s1.up(), возвращая указатель на строку (по-умолчанию в s2 пустая...

vector<pointer>::iterator - C++
В общем, есть некий родительский объект, в котором хранится динамический массив указателей на дочерние объекты. Требуется пройтись по всем...

Invalid pointer addition - C++
В чем ошибка ? hf=FindFirstFileW(L&quot;&quot;+Edit4-&gt;Text.c_str()+&quot;\\*.*&quot;, &amp;FindFileData); Код ошибки: Invalid pointer...


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

Или воспользуйтесь поиском по форуму:
BAADF00D
Заблокирован
02.06.2013, 22:59     pointer - pointer #7
да. он просто сбился с индексами. 15 валяется в 3 ем по счету "боксе", т.е. в 4-м фактически.
Yandex
Объявления
02.06.2013, 22:59     pointer - pointer
Ответ Создать тему
Опции темы

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