2016-02-03 6 views
-4

Рассмотрите этот пример.В чем разница между именем переменной и указателями?

#include <stdio.h> 

int main() { 
    int a = 5; 
    int b = a; 
    return 0; 
} 

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

Так что мой вопрос, если является целочисленной переменной, и это также указывает на то, то как она отличается от указателя?

Прошу прощения, если этот вопрос слишком прост. Но мне нужно знать.

+0

Указатель - это переменная, которая хранит адрес памяти некоторых других данных. это все. это оно. указатель IS - переменная с очень конкретным использованием. ни один из ваших варов выше - указатели. память назначается для хранения '5', но это не указатель. –

+0

Не путайте * букву «a» * с * переменной, называемой «a» *. – immibis

+3

Лучшей фразой может быть «a - это имя для этого блока памяти». –

ответ

5

Кто объяснил тебе это не так в этом случае:

#include <stdio.h> 

int main() { 
    int a = 5; //variable a has value 5 put it 
    //a does have an address 
    int b = a; 
    //variable b is created, it has its own seperate memory address. 
    //in this case the CONTENTS of a (5) are dumped inside b 
    return 0; 
} 

говоря int b=a; не будет делать переменные псевдонимами друг друга.

То, что вы слышали о такой:

//... 
int a=1; 
int *b = &a; //create a pointer called b and make it point to a 
//(set it equal to address of a) 

в вашем случае у вас есть:

memory addresses:   variable name   value stored at memory address 
1000      a(int)     5 
1004      b(int)     5 

очевидно изменяющиеся значения а и не влияют друг на друга

в случае I описанный у вас есть:

memory addresses:   variable name   value stored at memory address 
1000      a(int)     5 
1004      b(int*)     1000 

, как вы можете видеть, поскольку b является указателем, его фактическое значение является адресом a.

таким образом *b=3; изменит значение a

+2

Примечание: имена переменных не сохраняются в памяти. – immibis

1

В приведенном выше коде, a и b отдельные переменные, сидя в своем собственном блоке памяти.

Эта линия:

int a = 5; 

Создает переменную с именем a и дает ему начальное значение 5.

Эта линия:

int b = a; 

создал переменную с именем b и дает ему начальное значение независимо от текущего значения a есть, в этом случае 5.

Если вы позже добавить строку a=4, a будет содержать значение 4 в то время как b еще будет содержать значение 5.

3

При объявлении

int a = 1; 

Компилятор выделяет память для sizeof(int) байт и имя, что расположение данных (или блок памяти) a и поместить значение 1 в этом блоке. Очень простой способ - это именованное местоположение данных.

Вы можете думать о нем, как положить значение, присвоенное в поле с именем переменной, как shown ниже:
enter image description here

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

Присвоение одной переменной другой копирует значение и помещает это значение в новое поле.

a = 2; 
int b = a; 

enter image description hereenter image description here

Так, a и b не являются указателями, но имена различных блоков памяти, имеющих свои собственные адреса.

+3

Хорошая визуализация. –

1

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

Я сделаю некоторые адреса - скажем, находится на 1000 и Ь в 1004.

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

Address  Value 
    ... 
    1000  1234 
    1004  5678 
    ... 

Тогда int a = 5; задает пространство, отведенное для a до 5.

Address  Value 
    ... 
    1000  5 
    1004  5678 
    ... 

Затем int b = a; копии, что пространство, зарезервированное для b:

Address  Value 
    ... 
    1000  5 
    1004  5 
    ... 

На нет point - это фактически имена переменных.

Имена переменных используются только . В этом случае компилятор знает, что «a» означает «значение по адресу 1000» и что «b» означает «значение по адресу 1004». (Это немного упрощена, так как локальные переменные не всегда хранятся в тот же адрес, но вы получите идею)

+1

Нет 'a' не означает« значение по адресу X », это зависит от того, используется ли' a' как левое или правое значение. –

+0

«Сначала есть остаточные значения из того, что использовалось ранее в этой области памяти» - что вы подразумеваете под этим? – ashwani

+0

@ user132458 Это означает, что память может содержать что угодно. Ваш код может не быть первым кодом для использования адресов 1000 и 1004. (Но может быть, поскольку каждый процесс имеет собственное адресное пространство, то есть ваш адрес 1000 отличается от адреса другого процесса 1000) – immibis

1

В:

int a = 5; 

a обозначает контейнер, в котором хранится 5. a - это всего лишь идентификатор, представляющий либо местоположение памяти, либо ее содержимое. В a=5, a обозначает контейнер, в 5+a, a обозначает содержащееся значение.

В:

int b = a; 

b обозначает контейнер, в котором текущее значение контейнера a хранится.

Затем у вас есть 2 контейнера, один обозначается a, а другой - b. Оба содержат значение (то же самое для обоих).

Ни один из этих переменных не является указателем. Но, как и каждая переменная в C, они имеют адрес, который получается с оператором &. &a - адрес контейнера a.

Указатель представляет собой переменную (контейнер, если хотите), значение которого является адресом некоторого контейнера. Таким образом:

int *p = &a; 

p является контейнером, который содержит адрес a, мы коротко сказать p указывает на a. И, конечно, p также имеет адрес (как каждая переменная/контейнер): &p.

3

То, что вы можете думать это (если это в C++ контексте):

int a = 5; 
int& b = a; 

Это создает присвоенный к a, который связан с памятью a.

Изменение b Теперь изменяет a:

b = 42; 
if (a == 42) // true 

В вашем О.П., что не было бы так, поскольку b есть отдельная переменная независимая для a.

+2

Следует отметить, что это ответ C++. –

+0

@FiddlingBits Хорошая точка, отредактированный ответ соответственно. –

0

Вы вводите в заблуждение концепции времени компиляции и времени выполнения.

Имена в программе на языке С - это объекты времени компиляции, относящиеся к хранилищу, которые будут использоваться во время выполнения. Как только компилятор завершит свою работу, и у вас есть объектный код, имена исчезнут (кроме информации об отладке, которая не является частью объектного кода среды исполнения - ее дополнительной информации для отладчика, на которую ссылаются), и вашего объекта код напрямую работает с значениями в регистрах или в памяти (упомянутое выше «хранилище»).

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

Смежные вопросы