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

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

17.03.2015, 22:46. Показов 6997. Ответов 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
1357 / 856 / 365
Регистрация: 26.02.2015
Сообщений: 3,814
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
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,825
Записей в блоге: 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
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,825
Записей в блоге: 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
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,825
Записей в блоге: 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
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,825
Записей в блоге: 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
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,825
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru