Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.52/21: Рейтинг темы: голосов - 21, средняя оценка - 4.52
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,825
Записей в блоге: 4

Существует ли ячейка в памяти, которая хранит информацию о массиве?

15.05.2019, 01:31. Показов 4863. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нашёл такой вот сайт https://rsdn.org/article/cpp/O... nters2.xml , здесь сказано что при создании массива в дополнительной ячейке записана информация о массиве, правда ли это что есть такая ячейка которая хранит информацию о массиве: информацию о том сколько у него элементов или какой у него размер? Если это правда как найти номер этой ячейки и сколько таких ячеек может приходится на массив, учитывая то что массив может быть двумерный и так далее? Можно ли увидеть информацию этой ячейки и какая там может быть информация только размер или оно закодировано?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.05.2019, 01:31
Ответы с готовыми решениями:

Как проверить существует ли ячейка в массиве
Как проверить существует ли ячейка в массиве по заданному ключу например question

Создать структуру данных, которая хранит информацию о банковском счете – его номер, тип и баланс
помогите, пж, создать консольное приложение Создать структуру данных, которая хранит информацию о банковском счете – его номер, тип и...

В какой области памяти хранится указатель (сама переменная, которая хранит адрес)?
Привет! В общем у меня возник небольшой вопрос :) Если мы объявляем указатель, выделяем ему память, то память выделяется в куче, а адрес...

29
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
15.05.2019, 01:55
а смысл? Вам жалко ещё раз записать размер массива в какую-либо переменную, даже если предположить, что он где-то и без того хранился, что с того? Невелика потеря записать его ещё раз.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
15.05.2019, 02:28
Цитата Сообщение от Nexi99 Посмотреть сообщение
правда ли это что есть такая ячейка которая хранит информацию о массиве
Нет, такой ячейки нет.

В типичной реализации единственная частная ситуация, когда информация о количестве элементов массива может храниться - это выделение через new [] массива объектов с нетривиальным деструктором, как описано здесь:

Можно ли обойти динамический массив не зная его размер?

Но это внутренняя служебная информация, вам не доступная.

В прилинкованной вами статье на RSDN написано, что оператор new [] якобы всегда сохраняет количество элементов массива. Это неправда.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
15.05.2019, 02:33
Цитата Сообщение от Nexi99 Посмотреть сообщение
здесь сказано что при создании массива в дополнительной ячейке записана информация о массиве
При выделении памяти в рантайме вы можете(и обязаны, для последующего использования и освобождения) сохранить адрес первого байта выделенного участка в переменной(ячейке памяти в вашем коде), кроме самого адреса она ничего не содержит. Размер выделенного участка памяти, вы так же можете сохранить(точнее он уже вероятно хранился) в другой переменной.

Не по теме:

Можно вообще написать инструкциюnew int[1024]; и 4кб памяти растворятся в небытие, вы не сможете получить к ним доступ(хотя информация о расположении и размер будет известен системе, но вашему коду это не доступно)

Статические массивы, будь то двумерные, трехмерные и т.д. вообще представляют собой непрерывный участок памяти(т.е. они одномерные по сути) являются константами времени компиляции, т. е. нет необходимости хранить адрес первого байта (и размер) в отдельном участке памяти. Компилятор сам это вычислит и просто подставит непосредственно в машинный код как конкретные значения и смещения.
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,825
Записей в блоге: 4
15.05.2019, 18:12  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
Статические массивы, будь то двумерные, трехмерные и т.д. вообще представляют собой непрерывный участок памяти(
Если массивы многомерные и представляют непрерывный участок памяти то смотрите: если я объявлю массив такого типа
int Mas[2][10]={{},{}} и захочу обратиться по вашей теории к 20му элементу Mas[19] то компилятор выведет адрес а не значение, что говорит о том что они лежат не на одном участке а как-то параллельно т.е в разных участках памяти, как вы можете объяснить?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
15.05.2019, 18:21
Цитата Сообщение от Nexi99 Посмотреть сообщение
по вашей теории
это не моя теория, int [2][10] это тип со свойственными ему арифметикой и синтаксисом, если хотите обратится как Mas[19] то нужно преобразовать тип static_cast<int*>(Mas)[19]

Добавлено через 3 минуты
ради эксперимента напечатайте в консоль адреса каждого элемента по порядку
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,825
Записей в блоге: 4
15.05.2019, 18:24  [ТС]
Если обратиться к Mas[9] то будет выведен 0, что соответствует объявленному массиву, где хранится 2ой столбик можете объяснить? Зачем преобразовывать тип через static_cast?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
15.05.2019, 18:37
Nexi99,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
int main()
{
    int mas[3][3]
    {
        {1,2,3},
        {4,5,6},
        {7,8,9}
    };
 
    for (int i = 0; i < 3; ++i)
        for (int j = 0; j < 3; ++j)
            std::cout << &mas[i][j] << std::endl;
    std::cout << "------------\n";
    for (int i = 0; i < 9; ++i)
        std::cout << &static_cast<int*>(*mas)[i] << std::endl;
}
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
15.05.2019, 19:13
Nexi99, не нужно путать

C++
1
int Mas[2][10];
и
C++
1
int **Mas = new int *[2]  {new int[10], new int [10]} ;
Первый - содержится в памяти как одномерный массив, второй - динамически выделенный массив указателей, в которые указывают на динамически выделенные массивы строк. Обращаться к их элементам можно идентично, Mas[1][5] например. Но преобразовать один к другому нельзя, так как

Mas[1] для второго выполняется разыменованием указателя, т.е. *(Mas+1), а вот для первого идёт именно пересчёт положения элемента (Mas + 1* 10) . Во втором случае результатом будет тип int*, а первого - int[10]. Хотя первый может быть приведён к int* .
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
15.05.2019, 19:34
Цитата Сообщение от Nexi99 Посмотреть сообщение
Если массивы многомерные и представляют непрерывный участок памяти то смотрите: если я объявлю массив такого типа int Mas[2][10]={{},{}} и захочу обратиться по вашей теории к 20му элементу Mas[19] то компилятор выведет адрес а не значение, что говорит о том что они лежат не на одном участке а как-то параллельно т.е в разных участках памяти, как вы можете объяснить?
Нет, ни о чем подобном это не говорит.

Во-первых, когда говорят, что массив представляет собой "непрерывный участок памяти", то речь идет именно о внутреннем представлении массива в памяти, а не о том, что с двумерным массивом можно смело работать как с одномерным. Ни к какому элементу Mas[19] вы обращаться не можете. Первый индекс в вашем случае может быть только 0 или 1.

Во-вторых, то, что вы в таком случае видите "адрес", говорит лишь о том, что в языке С++ обыкновенный массив во многих контекстах имеет свойство неявно преобразовываться к значению типа "указатель". Именно этот указатель вы и наблюдаете. Никакие "разные участки памяти" тут никаким образом не замешаны.

И никакой "теории" тут нет - это обычные базовые факты из спецификации языка.

Добавлено через 2 минуты
Цитата Сообщение от Nexi99 Посмотреть сообщение
Если обратиться к Mas[9] то будет выведен 0
Здесь вообще не понятно, о чем идет речь. Какой "0", если вы сами только что сказали, что будет выведен адрес?
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,825
Записей в блоге: 4
15.05.2019, 20:34  [ТС]
Добавлено через 37 секунд
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Здесь вообще не понятно, о чем идет речь. Какой "0", есл
Я написал что если забить Mas[19] то будет 0. Я запутался мне почему-то показалось что первые 10 чисел оно выводит, но видимо всё сложнее чем я думал.Значит получается оно выделяет отдельные участки памяти и с помощью множителей находит эти участки. Код приведу ниже.

Добавлено через 3 минуты
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include "stdafx.h"//должна быть в начале
#include <conio.h>
#include <iostream>
 
using std::cout;
using std::endl;
using std::cin;
 
/*template<typename T> в с++ не работает
typename T typeof(T value)
  {
   cout <<(typename(T value)<<endl;
   return(value);
  }*/
 
template<typename T> void Fun(T a[],size_t m=0,size_t n=5 )
{
      
    for ( size_t i = 0; i < m; i++ )
    {
        for ( size_t j = 0; j < n; j++ ) 
            {
        cout <<(a[i * n + j ])<<" ";}
    }
cout <<endl;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    int mas[6]={1,2,3,4,5,6},
     mas1[2][2]={{1,4},{2,6}};//int //{{},{}};
    int mas2[2][2][2];
    //typeof(mas);typeid.name();
    cout<<mas1[0]<<endl;
 
    //Fun(reinterpret_cast <double*>(mas)/*,6,1*/);//
    Fun(reinterpret_cast <int*>( mas1),2,2);
    //typeof(mas);
 
    _getch();
    return 0;
}
На данном примере выводим 2умерный массив как одномерный и мне интересны как расположены значения в памяти а также какую роль играет size_t.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
15.05.2019, 20:44
Цитата Сообщение от Nexi99 Посмотреть сообщение
Значит получается оно выделяет отдельные участки памяти и с помощью множителей находит эти участки. Код приведу ниже.
Ваш код как раз и демонстрирует тот факт, что никаких "отдельных участков памяти" не существует. Многомерный массив в С и С++ - это всегда один непрерывный блок памяти.

Вместо понимания этого простого и естественного факта вы упорно продолжаете изобретать какие-то сюрреалистические теории вроде "с помощью множителей находит отдельные участки памяти".
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,825
Записей в блоге: 4
15.05.2019, 20:49  [ТС]
Как он вывелся как одномерный как это произошло? Объясните этот феномен.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
15.05.2019, 21:00
Цитата Сообщение от Nexi99 Посмотреть сообщение
Как он вывелся как одномерный как это произошло? Объясните этот феномен.
Вам же уже объяснили, что когда вы объявляете двумерный массив

C++
1
int mas[2][2];
то в памяти вы фактически получаете единый непрерывный блок: одномерный массив из 4 элементов типа int, которые располагаются в памяти так

Code
1
{ mas[0][0], mas[0][1], mas[1][0], mas[1][1] }
Именно этот одномерный массив вы и выводите своим кодом "с помощью множителей" и reinterpret_cast.
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,825
Записей в блоге: 4
15.05.2019, 21:20  [ТС]
Во первых я вывел его так cout <<(a[i * n + j ])<<" "<<endl;
во вторых вот эти штуки size_t они и сыграли ключевую роль и циклы что крутят лезут куда-то
C++
1
2
3
4
5
6
for ( size_t i = 0; i < m; i++ )
    {
        for ( size_t j = 0; j < n; j++ ) 
            {
        cout <<(a[i * n + j ])<<" ";}
    }
Получается что сначала массив был таким mas[][] а потом оно просто пересчитало где находятся эти элементы и пихнуло их в одномерный массив благодаря тому что у с++ есть доступ к памяти, потому что подобные записи не прокатывают например в MQL4. Расскажите про size_t какую оно выполняет роль.

Добавлено через 3 минуты
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
своим кодом "с помощью множителей" и reinterpret_cast.
C++
1
_cout __ &static_cast_int__(_mas)[i] __ std__endl
static_cast требует указания типа int, duoble и т.д как сделать так чтобы тип оно определяло само?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
15.05.2019, 21:20
C++
1
static_cast<decltype(*mas)>(*mas)
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,825
Записей в блоге: 4
15.05.2019, 21:27  [ТС]
Спасибо это очень важный для меня ответ на вопрос, также я эту тему создал Как вернуть тип переменной и любого другого элемента программы? где спрашивал как тип вернуть. Я хочу из MQL4 передавать массивы разных типов и размеренностей и универсальная функция будет работать с этим всем делом.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
15.05.2019, 21:57
Цитата Сообщение от Nexi99 Посмотреть сообщение
Во первых я вывел его так cout <<(a[i * n + j ])<<" "<<endl;
И что?

Цитата Сообщение от Nexi99 Посмотреть сообщение
Получается что сначала массив был таким mas[][] а потом оно просто пересчитало где находятся эти элементы и пихнуло их в одномерный массив
Это ваши непонятно откуда взявшиеся фантазии. Никакого "сначала был таким, а потом оно пихнуло" тут нет. Ничего оно никуда не "пихало". Ваши элементы с самого начала лежали в одномерном блоке памяти, как я показал выше.

Цитата Сообщение от Nexi99 Посмотреть сообщение
static_cast требует указания типа int, duoble и т.д как сделать так чтобы тип оно определяло само?
Это бессмысленный вопрос. static_cast предназначен для приведения типа вручную. "Оно само" никак не может знать, к какому типу вы хотите выполнить приведение.

Цитата Сообщение от zayats80888 Посмотреть сообщение
C++
1
static_cast<decltype(*mas)>(*mas)
Какой смысл в static_cast выражения к тому типу, который выражение уже имеет и так?
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,825
Записей в блоге: 4
15.05.2019, 22:27  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Ваши элементы с самого начала лежали в одномерном блоке памяти
Я о том как это выглядит изнутри, "одномерный блок"- что под ним понимается и почему это дело выводится через эту систему
C++
1
2
3
4
5
6
for ( size_t i = 0; i < m; i++ )
    {
        for ( size_t j = 0; j < n; j++ ) 
            {
        cout <<(a[i * n + j ])<<" ";}
    }
Одномерный блок и одномерный массив это разные вещи. Я думал оно просто делит столбик на части например mas1[2][2],
А23A
А24A будут хранить mas[0][0] и mas[1][0], а
А25A
А26A будут хранить mas[0][1] и mas[1][1], т.е. линейное расположение. Но видимо тут что-то посложнее

может так
А23А
А24А будут хранить mas[0][0] и mas[1][0]
А23В
А24В будут хранить mas[0][1] и mas[1][1].

А с помощью size_t вычисляет нужный сектор.

Добавлено через 18 минут
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Какой смысл в static_cast
без static_cast оно не берёт массивы разных размеренностей, а массивы будут передаваться разные как по типу так и по размеренности.
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,825
Записей в блоге: 4
17.05.2019, 19:37  [ТС]
Помогите пожалуйста почему не работает такая запись?
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
29
#include "stdafx.h"
#include <conio.h>
#include <iostream>
 
using std::cout;
using std::endl;
using std::cin;
 
template<typename T> void Fun(T a[],size_t m=2,size_t n=2)
{     
    for ( size_t i = 0; i < m; i++ )
    {
        for ( size_t j = 0; j < n; j++ ) 
            {
        cout <<(a[i * n + j ])<<" "<<endl;
        }
    }cout<<endl;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    int mas[6]={1,2,3,4,5,6};
    double mas1[2][2]={{1,4},{2,6}};//int //{{},{}};
    Fun(reinterpret_cast <int*>(*mas),6,1);//так работает  
    //Fun(static_cast <decltype(*mas)>(*mas),6,1);//а через decltype не работает
 
    _getch();
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.05.2019, 19:37
Помогаю со студенческими работами здесь

Написать программу, которая бужет выводить информацию о компьютере и о состоянии памяти
Написать программу, которая бужет выводить информацию о компьютере и о состоянии памяти.

NicEdit где хранит временную информацию
Всем привет! Целый день мучаюсь с отправкой данных из nicEdit ajax-ом и не получается. Когда я ввожу данные в поле редактора, то они туда...

Существует ли функция, которая детектирует наличие в массиве полной строки, совпадающей с заданной
$m_ident = 77; $metka = &quot;77AB231C-C75A-954D-796F-72F1EE35DD8D&quot;; if(in_array($metka, $m_ident)) echo &quot;YES&quot;; Выдает...

Существует ли ячейка, как проверить Dataset C#
Как проверить существует ли ячейка датасета, потому что если передать намер ячейки которой нет, отладчик негодует.

Класс,который хранит информацию об участниках спортивных соревнований
#include &quot;Sport.h&quot; #include&lt;iostream&gt; #include&lt;string.h&gt; #include&lt;stdlib.h&gt; #include&lt;iomanip&gt; using namespace std; int...


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

Или воспользуйтесь поиском по форуму:
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