Как работает переменная в C / C ++?

Как работает переменная в C / C ++ ?

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

17
задан Mateen Ulhaq 20 August 2011 в 18:16
поделиться

9 ответов

Переменная - это абстракция (удобное имя) для позиции памяти на компьютере. В C / C ++, если переменная имеет тип int , это будет удобное имя для адреса памяти, содержащего целочисленное значение.

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

30
ответ дан 30 November 2019 в 10:16
поделиться

Обратите внимание на следующие определения

char *string="abc";
int b = 10;
int *bptr = &b;

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

Adr  content
1000 a b c 0    // "abc" : string literal '\0' terminated 
1004    1000    // *string: pointer to string (address 1000)
1008      10    // b = 10 : integer value
1012    1008    // *bptr  : pointer to &b 

Используя, например, printf ("% s \ n", строка); вы не хотите копировать всю строку, вместо этого вы указываете адрес, с которого начинается строка (вызов по ссылке).

12
ответ дан 30 November 2019 в 10:16
поделиться

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

0
ответ дан 30 November 2019 в 10:16
поделиться

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

Как на самом деле работает автоматическое выделение памяти в C ++?

4
ответ дан 30 November 2019 в 10:16
поделиться

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

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

http://en.wikipedia.org/wiki/Register_allocation

2
ответ дан 30 November 2019 в 10:16
поделиться

Не приятель указатель - это набор переменных, и для их различения, помимо количества переменных, значения (целые, символьные) должны быть разными!

0
ответ дан 30 November 2019 в 10:16
поделиться

Фактически переменная не работает. Вместо этого программа может работать с переменными.

-2
ответ дан 30 November 2019 в 10:16
поделиться

Чтобы прочитать / записать переменную, нужно прочитать / записать кусок байта в известном месте. "знать местоположение" - это местоположение, известное компилятору, это может быть:

  • Фиксированный адрес. Компилятору известны все адреса глобальных переменных. Если мы читаем / записываем глобальную переменную, компилятор помещает такую ​​инструкцию: «чтение / запись памяти по адресу 0x00235A87»
  • Фиксированное смещение стека. Локальные переменные помещаются в стек. Указатель на вершину стека («указатель стека» или «SP») хранится в регистрах процессора. Компилятор знает, каково смещение локальной переменной от вершины стека. Если мы читаем / записываем локальную переменную, компилятор помещает такую ​​инструкцию: «читать / записывать память по адресу 'SP-0x05'».
  • Регистры процессора. Переменные при использовании загружаются в регистры процессора. Компилятор знает, какие регистры. Чтобы использовать их, чтение / запись в память не требуется, компилятор просто помещает инструкции, которые используют регистры, например: «добавить содержимое регистра B в регистр A».

На самом деле алгоритм доступа к переменной записан в виде инструкций процессора. Переменная может быть адресована фиксированным адресом памяти, вычисленным адресом памяти (с использованием фиксированного смещения и значения, хранящегося в регистре) или регистром процессора. Компилятор помещает инструкцию, которая перемещает значения переменных между памятью / регистром и между регистром / регистром. Переменная может даже не существовать в памяти, она может все время храниться в регистрах.

В том, что вы говорите, есть своего рода аналогия.

Учитывая вышеизложенное, помните, что указатель - это переменная, которая хранит адрес (который является целым числом).Если мы разыменовываем указатель и считываем указанное значение, необходимо выполнить два шага. Во-первых, мы должны прочитать переменную-указатель, как любую другую переменную. После этого адрес заносится в реестр. Затем мы читаем указанную переменную с инструкцией типа: «читать память по адресу, хранящемуся в регистре A».

8
ответ дан 30 November 2019 в 10:16
поделиться

Переменная - это просто абстракция. Это идея именованного значения, на которое вы можете ссылаться, читать и (иногда, в зависимости от его типа) изменять.

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

Но иногда переменная сохраняется в регистре, а не в памяти. Тогда у него нет адреса, и вы не можете создавать на него указатели.

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

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

Например, этот код:

int x = 10;
y += 10;

может быть скомпилирован, представив x и y как ячейки памяти, а затем сложение выполняется с помощью такой инструкции, как «добавить значение из адреса памяти x к значению по адресу памяти y. ".

Но компилятор может также закодировать константу 10 в самой инструкции, генерируя команду «добавить 10 к значению по адресу памяти y». Конечно, x была переменной в исходном исходном коде, но это больше не ячейка памяти.Он кодируется непосредственно в поток инструкций.

6
ответ дан 30 November 2019 в 10:16
поделиться