(C) каким образом мы можем манипулировать длиной памяти и адресами? - PullRequest
0 голосов
/ 24 марта 2019

Мне трудно предложить этот вопрос многим людям.если кто-то здесь может помочь мне пролить некоторый свет на это, я был бы очень признателен, так как это было основным препятствием на протяжении почти трех лет с моей проблемой.

, если вы знаете свои массивы и память, чем пропустить последний абзацдля большого вопроса, но если вы прочитаете это, это может помочь вам понять, почему и с какими понятиями я пытаюсь понять.

, поэтому у нас есть инициализированный массив


    int main(){
    int x=10;
    int arr[x]={3,5,1,9,4,17,2,12,6,8};

для доступа5-й элемент массива, мы распечатали бы его следующим образом


    printf("%d",arr[4]);

Теперь мой первый вопрос вращается вокруг этого процесса.функция printf определяет, что я хочу напечатать целое число, и в качестве каталога я даю ему имя массива / адрес первого элемента и указываю, что мне нужен 4-й элемент массива.

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


       0     1     2     3     4     5     6     7     8     9
    [1000][1004][1008][1012][1016][1020][1024][1028][1032][1036]
    {  3    5     1     9     4     17    2     12    6      8  }

сейчас, это все просто, но в то время, когда я изучал, как работают компьютеры, я понял одну очень важную вещь, компьютерыочень глупо, и поэтому мы их программируем, поэтому, пожалуйста, потерпите меня.

вопрос 1: это точное представление о памяти?Вот как почти все на YouTube, в классах и т. д. рисуют картинку, последовательный список, начинающийся с 1000 и увеличивающийся на +4, что, если у меня два массива одинакового размера?они не могут занимать одни и те же адреса памяти, так как я могу отслеживать где.

вопрос 2: я понимаю, что arr [4];относится к значению 4-й позиции массива.но это обр [4], что это?4. это 4 хранится где-то в памяти?какой тип данных это 4?это тоже указатель?Насколько я понимаю, это расширение массива указателей, которое меня смущает.поскольку массив указывает на 1-й элемент в позиции 0, как указатель «4» сосуществует внутри указателя?как выглядит процесс для компьютера?я предполагаю, что это не проблема, потому что 4 является аргументом указателя и поэтому может существовать в указанном указателе массива.

но процесс?это, перейти к arr [0] и затем считать 4 байта от позиции 0 4 раза?какой адрес занимает позиция 0?я знаю, что в учебных целях это визуализируется как начиная с 1000, но всегда ли это так?почему бы не обратиться к 1036 и отсчитать 4 оттуда?я знаю, что где-то читал, что адреса памяти разделяют память, убедившись, что если символ (1 байт) хранится в памяти рядом с целым числом (4 байта), то между ними есть пробелы в памяти, чтобы все это делилось на 2.

Итак, теперь перейдем к моему последнему вопросу, о котором я ничего не могу найти в Интернете.Могу ли я как-то сказать компьютеру назначить длину памяти от индекса 0 - n переменной?возможно я спрашиваю неправильно, поэтому позвольте мне перефразировать.Есть ли тип данных, который определяет длину памяти, а не положение?я знаю, что мы можем получить доступ к количеству памяти, которое занимает определенная переменная, но для этого мы ссылаемся на переменную и в результате получаем память.я хочу назначить длину памяти переменной.

1 Ответ

0 голосов
/ 25 марта 2019

существует ли тип данных, который определяет длину памяти, а не позицию?

ВСЕ типы данных в C делают это.Каждый тип определяет, сколько байтов необходимо для хранения этого типа и что означают отдельные биты в каждом байте.Это определяется реализацией, поэтому разные компиляторы и разные цели определяют их по-разному, но язык дает вам инструменты для написания переносимого кода, который будет работать четко определенным образом, каким бы он ни был.

  • sizeofговорит вам размер любого типа в байтах.поэтому sizeof(int) скажет вам, насколько велика int на вашей цели - обычно 4, но некоторые цели используют 8 или 2.
  • CHAR_BIT сообщает вам размер байта - сколькобиты в байте.Вам не часто это нужно, но когда вы делаете, это доступно.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...