Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.79/34: Рейтинг темы: голосов - 34, средняя оценка - 4.79
14 / 14 / 16
Регистрация: 26.01.2015
Сообщений: 213

Индексация массивов с помощью указателей

17.03.2015, 22:46. Показов 7260. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не смог понять логику вот этой программы, связанной с объявлением массивов через указатель:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include<windows.h>
#include<cstdlib>
using namespace std;
void main()
{
    const int str = 3, sto = 5;
    int mas[str][sto];
    int *p = &mas[0][0];
    
    for (int i = 0; i < str*sto; i++)
    {
        *(p + i) = rand() % 100;
        cout << *(p + i) << "\t";
    }
    cout << endl;
    
}
Непонятен именно вот этот фрагмент полностью
C++ (Qt)
1
2
 *(p + i) = rand() % 100;
        cout << *(p + i) << "\t";
Что за "p+i"? Желательно как можно подробнее.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.03.2015, 22:46
Ответы с готовыми решениями:

Указатели и массивы. Индексация с помощью указателей. Передача массивов в функции. Динамические массивы (обработка матриц)
Для каждого элемента , bij, i= 1,...,n , j=1,...,n определяется свой многоугольник местонахождением соответствующего элемента aij (см....

Индексация массивов, арифметика указателей
инициализирую одномерный массив и делаю на него указатель const int N = 6; int X = {9,3,2,3,6,8}; int *mas = X; ...

Слияние двух массивов, решение с помощью указателей
помогите,пожалуйста,решить! Задан массив A из N элементов и массив B из M элементов. Сформировать массив L из массивов A и B путем их...

24
 Аватар для Nishen
1359 / 857 / 366
Регистрация: 26.02.2015
Сообщений: 3,824
17.03.2015, 22:48
тоже самое, что и p[i].
1
 Аватар для _Valera_
495 / 377 / 136
Регистрация: 27.01.2015
Сообщений: 1,588
17.03.2015, 22:53
Лучший ответ Сообщение было отмечено Ofelion как решение

Решение

*p - указатель на ячейку массива mas, с индексами (0,0), *(p + i) - передвигает указатель на след ячейку, такое себе читерство, что б не писать два цикла for, надо и себе запомнить)
1
11 / 11 / 12
Регистрация: 27.10.2014
Сообщений: 108
17.03.2015, 22:57
Индексация масивов может быть разной, с помощью указателя или какого-то числа.
Почитай про указатель.
C++
1
2
*(p+i)=p[i];
*(*(p+i)+j)=p[i][j];
0
14 / 14 / 16
Регистрация: 26.01.2015
Сообщений: 213
17.03.2015, 23:18  [ТС]
Всем спасибо!
Всё понятно стало. Все очень помогли!
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
17.03.2015, 23:21
Цитата Сообщение от Nishen Посмотреть сообщение
тоже самое, что и p[i].
То же самое, только UB.

Добавлено через 1 минуту
Вот тут добрый человек подробнее объясняет.
1
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
17.03.2015, 23:44
Ofelion
Именно это от Вас прячет компилятор С/С++.
Любая переменная для процессора, это указатель на начало этой переменной, т.е. фактически её адрес и её длина. Процессору глубоко безразлично, что обрабатывать байт, слово, двойное слово и т.д. он всё обработает.
В данном случае компилятор автоматически в (p + i) добавляет (p + i*sizeof(int)){массив типа int}таким образом при выполнении (p + i) происходит автоматический переход к следующему элементу массива в строке. Т.к. в памяти строки массивов хранятся последовательно т.е. <строка1><строка2>..<строкаN> происходит вывод всего массива.
Удачи в освоении языка!
1
14 / 14 / 16
Регистрация: 26.01.2015
Сообщений: 213
18.03.2015, 00:49  [ТС]
Цитата Сообщение от Constantin Cat Посмотреть сообщение
Ofelion
Именно это от Вас прячет компилятор С/С++.
Любая переменная для процессора, это указатель на начало этой переменной, т.е. фактически её адрес и её длина. Процессору глубоко безразлично, что обрабатывать байт, слово, двойное слово и т.д. он всё обработает.
В данном случае компилятор автоматически в (p + i) добавляет (p + i*sizeof(int)){массив типа int}таким образом при выполнении (p + i) происходит автоматический переход к следующему элементу массива в строке. Т.к. в памяти строки массивов хранятся последовательно т.е. <строка1><строка2>..<строкаN> происходит вывод всего массива.
Удачи в освоении языка!
Константин, спасибо
Я стараюсь, практически всё понятно, но вот отдельные моменты вроде вот таких приходится спрашивать, т.к. в Гугле не на всё ответ получается найти))
0
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
18.03.2015, 01:03
Ofelion
Удачи в освоении языка!
Это очень красивый язык. И над некоторыми фантазиями программистов приходится думать. Советую найти IDA, он позволит Вам понять, как Вами написаный код превращается в исполняемый, но в данном случае Вам нужно ещё учить Ассемблер, думаю он лишним не будет.
Удачи!
0
14 / 14 / 16
Регистрация: 26.01.2015
Сообщений: 213
18.03.2015, 03:16  [ТС]
Спасибо за информацию))
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,838
Записей в блоге: 4
09.12.2019, 12:07
Цитата Сообщение от Constantin Cat Посмотреть сообщение
В данном случае компилятор автоматически в (p + i) добавляет (p + i*sizeof(int)){массив типа int}таким образом при выполнении (p + i) происходит автоматический переход к следующему элементу массива в строке. Т.к. в памяти строки массивов хранятся последовательно т.е. <строка1><строка2>..<строкаN> происходит вывод всего массива.
Когда происходит расчёт (p + 9) к примеру то происходит мгновенный переход на элемент p[9] или сначала прогоняет от 0 до 8, а потом программа попадает на 10 действии на 9 элемент и происходит вывод.
0
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
09.12.2019, 12:15
Цитата Сообщение от Nexi99 Посмотреть сообщение
Когда происходит расчёт (p + 9) к примеру то происходит мгновенный переход на элемент p[9] или сначала прогоняет от 0 до 8
Никто ничего не прогоняет, обычная арифметика 1 + 2 = 3
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,838
Записей в блоге: 4
09.12.2019, 13:15
Цитата Сообщение от Raali Посмотреть сообщение
Никто ничего не прогоняет, обычная арифметика 1 + 2 = 3
А как же оно находит участок где храниться 9ый индекс массива. У него же нет зрения как у человека чтобы просто взять и махнуть на 9ый индекс но даже человек ищет глазами точку остановки в книге чтобы продолжить чтение. Как это работает, объясните. Вы утверждаете что переход мгновенный 0+9 и попадаем на нужный участок но мне не понятно как это происходит.
0
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
09.12.2019, 13:57
Цитата Сообщение от Nexi99 Посмотреть сообщение
А как же оно находит участок где храниться 9ый индекс массива.
BX = p
SI = i
Именно в такую строку превращает компилятор С обращение к элементу массива № 9.

Assembler
1
mov ax,[ bx+ si + n] => AX= [ p + i + n ], где n := 0 . . M
Процессор прочитав КОП операции, взял значение ВХ, добавил к нему значение SI, прочитал значение n и добавил его к адресу, и после этого, читает значение с вычисленого адреса в АХ.

Это называется :косвенно-индексная адресация со смещением
На самом деле там все несколько сложнее, но для упрощенного объяснения - этого должно быть достаточно.
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,838
Записей в блоге: 4
09.12.2019, 14:26
Цитата Сообщение от Constantin Cat Посмотреть сообщение
Процессор прочитав КОП операции, взял значение ВХ, добавил к нему значение SI, прочитал значение n и добавил его к адресу, и после этого, читает значение с вычисленого адреса в АХ.
Это называется :косвенно-индексная адресация со смещением
На самом деле там все несколько сложнее, но для упрощенного объяснения - этого должно быть достаточно.
Значит оно туда прыгает. Сначала оно вычисляет координаты а потом тупо туда прыгает. Но опять же если оно делает это не постепенно а мгновенно, значит в этом "сложнее" и кроется вся суть как это происходит. Это напоминает клавишу End, нажал и курсор залетел в конец строки, а откуда оно знает что там конец строки не понятно, также непонятно и то что происходит в тот момент времени когда клавиша уже нажата и до того момента когда курсор переместился в конец. Вот даже это понять уже нечто, не говоря уже обо всём остальном.
Или другой пример. предположим мы производим запись в файл, программа должна знать точку остановки этого файла далее для того чтобы в этот файл что-то дописать нужно сначала переместиться на позицию остановки или указанную а лишь затем продолжить запись или перезапись, отсюда вопрос как работают тогда массивы.

Я думаю оно может посчитать количество памяти пропуска, а когда указан индекс машина пропустит участок битов и попадёт по координатам другого объяснения нет.
0
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
09.12.2019, 15:33
Цитата Сообщение от Nexi99 Посмотреть сообщение
отсюда вопрос как работают тогда массивы.
смотри, массив int находится по адресу 1000
я хочу произвести запись в 5 элемент
куда мне нужно записывать? 1000 + 5 * sizeof(int) все легко и просто
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,838
Записей в блоге: 4
09.12.2019, 16:04
Цитата Сообщение от Raali Посмотреть сообщение
смотри, массив int находится по адресу 1000
я хочу произвести запись в 5 элемент
куда мне нужно записывать? 1000 + 5 * sizeof(int) все легко и просто
А я хочу читать страницу с середины, так наверное нужно до этой середины дойти а потом уже продолжить чтение, или можно имея перед собой открытую страницу наугад тыкнуть пальцем и это будет середина. Я спрашиваю как оно туда попадает я понимаю что оно отсчитывает. Значит оно работает так: имеем указатель на 4 индекс, далее становимся на 0 и начинаем считать 1 адрес 2ой адрес 3ий адрес 4адрес и далее уже получаем доступ к содержимому. Если я иду по лестнице и мне нужно попасть на 5ую ступень нужно же пройти первые четыре или нет, у меня не хватит ног чтобы на пятую шагнуть. Должно же быть этому объяснение.
0
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
09.12.2019, 16:40
Цитата Сообщение от Nexi99 Посмотреть сообщение
А я хочу читать страницу с середины
Не совсем понимаю где тут связь с записью (p + n)
n уже знает сам пользователь.

при чем тут вообще страницы какие то
мы имеем массив - это кусок памяти размера X, куда хотим туда и прыгаем в любой момент времени зная адрес его начала и точку назначения
от p до p +X вольны делать что хотим
0
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
09.12.2019, 19:26
Цитата Сообщение от Nexi99 Посмотреть сообщение
Значит оно туда прыгает.
CPU, не "оно", он выполняет только:
OCR (operation code read) - чтение кода операции;
CBR (control byte read) - чтение управляющего байта кода операции (ED, DD, FD, CB),
IOP (internal CPU-operation) - внутренние операции ЦП, выходные сигналы управления
неактивны;
MRD (memory read) - чтение байта из косвенно адресованной ячейки памяти;
MRH (memory rend, high byte) - чтение старшего байта 16-разрядного слова из косвенно
адресованной ячейки памяти;
MRL (memory read, low byte) - чтение младшего байта 16-разрядного слова из косвенно
адресованной ячейки памяти;
MWR (memory write) - запись байта в косвенно адресованную ячейку памяти;
MWH (memory write, high byte) - запись старшего байта 16-разрядиого слова в косвенно
адресованную ячейку памяти,
MWL (memory write, low byte) - запись младшего байта 16-разрядного слова в косвенно
адресованную ячейку памяти;
ORD (operand read) - чтение операнда-байта, непосредственно представленного в команде;
ORH (operand read, high byte) - чтение старшего байта 16-разрядного слова, непосредственно
представленного в команде;
ORL (operand read, Ion byte) - чтение младшего байта 16-разрядного слова, непосредственно
представленного в команде;
PRD (port read) - ввод данных из порта;
PWR (port write) - вывод данных в порт;
SRH (stack read, high byte) - чтение из стека старшего байта;
SRL (stack read, low byte) - чтение из стека младшего байта;
SWH (stack write, high byte) - запись в стек старшего байта;
SWL (ataok write, low byte) - запись в стек младшего байта;
INTA (interrupt .acknowledge) - подтверждение прерывания микропроцессором;
SPI (stack pointer increment) - инкремент указателя стека в конце цикла;
SPD (atack pointer deorement) - декремент указателя стека в конце цикла;
Некоторые идеи i80, "одложил" у Zilog , после этого повился х86.
Каждая КОП процессора превращалость в последовательность микрокоманд, которые превращались в последовательность тактов процессора, т.е. время вывполнение той или иной операции.

Я уже Вам говорил это:
Цитата Сообщение от Constantin Cat Посмотреть сообщение
Именно это от Вас прячет компилятор С/С++
Пока Вы работаете в рамках компилятора, наслаждайтесь возможностями ЯВУ.
Но как только Вы начинаетесь думать как это происходит, Вам не сюда, Вам в ассемблер.
К Вам снийзойдет "просветление", которое откроет Вам глаза, на всю "мелочность" ЯВУ и всю правду асма.
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,838
Записей в блоге: 4
09.12.2019, 20:16
Цитата Сообщение от Raali Посмотреть сообщение
куда хотим туда и прыгаем в любой момент времени зная адрес его начала и точку назначения
от p до p +X вольны делать что хотим
Спасибо за ответы.
Цитата Сообщение от Constantin Cat Посмотреть сообщение
Пока Вы работаете в рамках компилятора, наслаждайтесь возможностями ЯВУ.
Но как только Вы начинаетесь думать как это происходит, Вам не сюда, Вам в ассемблер.
К Вам снийзойдет "просветление", которое откроет Вам глаза, на всю "мелочность" ЯВУ и всю правду асма.
Ну да я понял что это ассемблер. В общем спасибо за ответы. Просто я пишу программу где будет массив и я думаю над задачей о том как будет работать программа быстрее, если в массиве перевернуть индексацию и обращаться к последнему элементу как к первому, или обращаться в массив как есть. Судя по полученным ответам, я понял, что обращение в ячейку массива грубо говоря происходит мгновенно, т.е. нет разницы в какую ячейку обращаться т.к. оно не отсчитывает а сразу попадает в ячейку по адресу. Значит нет разницы куда обращаться в начало массива или в конец или есть, что можете сказать по этому поводу?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.12.2019, 20:16
Помогаю со студенческими работами здесь

Создание массивов указателей на массивы указателей
Помогите в решении задачи: создал массив указателей на массивы указателей на строки, но компилятор ругается на то что не может...

Индексация динамических массивов как она работает в С++?
Во всех книгах по крайней мере которые мне встречались массив например mass при инициализации i указывает количество строка а j...

Нотации массивов и указателей
Айвор Хортон в своей книге Beginning Visual C++ 2010 утверждает (стр. 183, 2-й абзац сверху) что нотация указателей работает быстрее...

Связь массивов и указателей
Здравствуйте! Помогите разобраться пожалуйста! Вот когда я определяю одномерный массив Type mass; Что происходит? ...

Переворот массива с помощью указателей
Здрасте! Учусь на программера недавно. Вот задали перевернуть массив рекурсивно с использованием указателей. На рекурсию я пока решил...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru