2013-09-07 2 views
0

Предположим, у меня есть следующий код в C:местоположения памяти указателя, переменной и значения в C?

int x = 1025; 
int *y = &x; 
  1. Что такое & у? Является ли это адресом в памяти переменной указателя y?
  2. Что такое переменная указателя y? Сохраняет ли он адрес переменной x?
  3. Что такое & x? Является ли это адресом в памяти переменной x или является ее адресом, 1025?
  4. Что такое переменная x? Это адрес его значения, 1025?
  5. Что такое * y? Это адрес 1025 = переменная x?

и большой один ...

При печати & у отображает адрес у, печать & х отображает адрес х, но печать х/* у просто печатает 1025, как бы я печатаю адрес 1025?

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

[EDIT] Ребята, я нашел свою ошибку; Я думал, что переменная x будет содержать адрес последовательности байтов, представляющих 1025. Стандартная корректировка Java-to-C. Спасибо всем за ответы

+0

Что вы пробовали? Вы пишете какой-нибудь C-код (например, скомпилированный с помощью 'gcc -Wall -g'), а затем шаг за шагом его используете какой-то отладчик (например,' gdb')? Покажите гораздо больше своего кода на C. –

+0

Для вас большой вопрос, цифры не имеют адресов. Вы имеете в виду, где хранится 1025 (в x)? – dcaswell

+0

Это не то, как работают указатели. Я предлагаю вам прочитать хорошую книгу C. Мы здесь не для того, чтобы научить вас всему языку, а помогать с конкретными вопросами программирования. –

ответ

3

Дано:

int x = 1025; 
int *y = &x; 

Q1. Что такое &y? Является ли это адресом в памяти указателя переменной y?

Да. Это адрес переменной y и имеет тип int **.

Q2. Что такое переменная указателя y? Сохраняет ли он адрес переменной x?

Да. Это переменная-указатель, которая (после фрагмента кода) содержит адрес x.

Q3. Что такое &x? Является ли это адресом в памяти переменной x или это его значение, 1025?

Это адрес переменной x. Так получилось, что x имеет 1025 на данный момент, но когда это значение меняется, &x все еще указывает на переменную x и, следовательно, на текущее значение x, а не на 1025 (потому что x содержит другое значение сейчас).

Q4. Что такое переменная x? Это адрес его значения, 1025?

Переменная x - это ячейка памяти, в которой в настоящее время хранится значение 1025, но это может измениться. Значения, такие как 1025, сами по себе не имеют адресов - это концепция из языков OO (я думаю, что Smalltalk имеет такую ​​концепцию, я думаю, что Java использует ее для типов объектов, но не для простых неъектных типов, таких как int) а не концепция C.

Q5. Что такое *y? Это адрес 1025 = переменная x?

Это не адрес 1025; это легкая часть. Если вы используете int i = *y;, то *y это значение в переменной, которая указывает на y, который в настоящее время x, который в настоящее время имеет значение 1025, поэтому i установлен в 1025. Однако, если вы используете *y = 1024;, то *y переменная что указывает на y, который является x, так что значение сохраняется в x*y) изменяется от 1025 до 1024.

Q6. Если печать &y отображает адрес y, печать &x отображает адрес x, но печать x/*y просто печатает 1025, как бы напечатать адрес 1025?

Первые два утверждения в порядке. Утверждение 'but' должно быть написано x/*y с пробелом между / и *, поскольку в противном случае вы начали комментарий. Тем не менее, это не должно напечатать 1025, но должен напечатать 1. Если вы получаете 1025, то вы написали что-то вроде:

printf("%d\n", x/*y); /* comment */); 

Там нет адреса для 1025 таковому. Там могут быть разные адреса для различных переменных, которые в настоящее время сохраняют значение 1025, но нет единого адреса для значения 1025. Это уже не-C-концепция, как уже упоминалось.

‡ Если кто-то не согласен с ссылками на Java или Smalltalk, дайте мне знать по комментариям, и я удалю те, которые ошибаются. Они не являются ключевой частью моего аргумента - я просто пытаюсь объяснить, что некоторые языки имеют концепцию, совершенно аналогичную «адресу 1025», хотя C нет.

0

Да, да, адрес (поэтому & называется оператором «адрес»), нет, нет.

Вот как вы должны думать о переменных в C. Они - обрывки бумаги, на которые вы можете написать значение. (Тип значения должен соответствовать типу, указанному на листе бумаги.) Все обрывки бумаги связаны вместе в ноутбуке, чтобы вы могли адресовать их по номеру страницы, который мы называем адресом.

Указательные переменные - это специальные листы бумаги, на которых вы указываете номер страницы. Вы можете позже проверить указатель, посмотреть, на какой лист бумаги он указывает, и посмотреть на это вместо этого.

Из этого следует, что:

  1. переменная имеет адрес. Это лист бумаги с номером страницы.
  2. Значение не имеет адреса. Это не листок бумаги, это что-то вроде номера, который вы можете написать на листом бумаги. Число, подобное 1025, не имеет номера страницы, но когда вы пишете «1025» на странице, вы вызываете x, тогда есть страница со номером страницы, на которой написано 1025.

Чтобы убедиться, что вы не можете взять адрес значения, попробуйте что-то вроде &1025. Компилятор этого не допустит.

1

Что такое & y? Является ли это адресом в памяти переменной указателя y?

Да.

Что такое переменная указателя y? Сохраняет ли он адрес переменной x?

Да.

Что такое & x? Является ли это адресом в памяти самой переменной x или является ее адресом, 1025?

Это адрес x. x может измениться, например, если вы установите его с помощью «x = 1024» в более поздней строке, но его адрес останется прежним

Что такое переменная x? Это адрес его значения, 1025?

х переменная, которая означает, что она занимает немного места в памяти, а биты в этом пространстве есть целое значение 1025.

Что такое * у? Это адрес 1025 = переменная x?

* y убирает указатель, что означает, что он получает значение памяти по этому адресу. Таким образом, он возвращает 1025.

Ваш «большой вопрос» - это просто вопрос № 3.

1
  1. Что такое & y? Является ли это адресом в памяти переменной указателя y?

    &y - это адрес, в котором хранятся содержимое переменной y, причем эти данные являются адресом (указатель) на int.

  2. Что такое переменная указателя y? Сохраняет ли он адрес переменной x?

    Да, y - указатель, который содержит адрес переменной x.

  3. Что такое & x? Является ли это адресом в памяти переменной x или является ее адресом, 1025?

    &x - адрес x, поэтому адрес в памяти самой переменной, а не постоянного значения, с которой вы его инициализировали.

  4. Какая переменная x? Это адрес его значения, 1025?

    Эта переменная сама по себе является областью хранения в памяти, «объектом» в терминах C. Внутри компилятор использует это имя для поиска адреса этого региона хранения.

  5. Что такое * y? Это адрес 1025 = переменная x?

    *y является значение любых y точек, в данном случае, 1025.

  6. как бы напечатать адрес 1025?

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

2

Что такое & у? Является ли это адресом в памяти переменной указателя y?

Да. У вас могут быть указатели на указатели.

int x = 357; 
int *y = &x; 
int **z = &y; 

Какая переменная указателя y? Сохраняет ли он адрес переменной x?

Да. В основном, это целочисленный тип, который (как его значение) содержит адрес «x».

Что такое & x? Является ли это адресом в памяти переменной x или является ее адресом, 1025?

Адрес переменной, который вместе с целым числом также хранит значение.

Какая переменная x? Это адрес его значения, 1025?

Это место в памяти нескольких байтов, содержащих данные. То, как интерпретируются данные, зависит от кода, который его использует. С целыми числами данные предназначены для представления числа (например, 1025), но его можно так же легко манипулировать, как если бы это было что-то другое, например пара символов или поплавок. Данные в памяти - это просто данные в памяти - что дает смысл, так это то, как он используется.

Что такое * y? Это адрес 1025 = переменная x?

1025 - это всего лишь данные, хранящиеся по адресу «x», значение, хранящееся в этих байтах памяти, вообще не изменяет местоположение «x». Когда «x» создается, его местоположение в памяти (на протяжении всего срока его службы) не изменяется.

So * y is x. * y 'dereferences' адрес, хранящийся в 'y' (адрес x), и поэтому вы работаете в блоке памяти, на который ссылаются как «x», так и «* y».

При печати & у отображает адрес у, печать & х отображает адрес х, но печать х/* у просто печатает 1025, как бы напечатать адрес 1025?

Печать x/* y должна печатать 1. x = 1025. *y = 1025. 1025/1025 = 1 1025 не имеет адреса. 1025 - это куча бит в нескольких байтах. 1025 - это последовательность бит (которую ваш код дает значение, но сам по себе не имеет смысла), хранящийся в нескольких байтах, который находится по адресу, хранящемуся в 'x' и '* y'.

Если мы предположим, целые четыре байта памяти (32-битные ОС и аппаратное обеспечение, скажем), то у вас есть четыре байта, в некотором случайном месте в памяти:

[01000100] [1101010] [00101001] [11010101] (gibbish binary for illustration) 

Двоичных биты хранятся в тех четыре байта не означает вещь, пока ваш код не примет решение как интерпретировать значение этих бит.

'x' is эти четыре байта. 1025 преобразуется в двоичный код и хранит в эти четыре байта. Адрес «x» - это адрес этих четырех байтов. «y» - это кусок байтов, в котором вы храните адрес «x». '* y' позволяет вам работать с байтами, в которых «y» хранит адрес. Доступ к * y дает те же байты, на которые указывает x.

0
  1. точно. Указатель - это переменная, а переменная имеет свой собственный адрес памяти.

  2. Да, указатель у инициализируется адресом переменной х

  3. & х является адресом переменной х. Вы можете распечатать его, если хотите четко видеть разницу.

  4. Переменная x сохраняется на определенном адресе в памяти. Это отличается от значения, с которым переменная инициализируется, в данном случае 1025.

Опять же, чтобы увидеть разницу, попробуйте распечатать адрес х и его значение:

int x = 1025; 
printf("%p", &x); //prints the address of x 
printf("%d", x); //prints the value assigned to x 

Последний вопрос: * y - указатель переменной и оператор разыменования *. Это означает, что вы получаете значение, сохраненное в переменной, на которую указывает y.

Ну на самом деле, если вы печатаете х/(* у), то вы должны получить 1 в результате, потому что вы бы 1025/1025

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