2013-05-19 2 views
1

Я узнал о указатели C++, и у меня есть следующий вопрос.Должны ли адреса переменных, объявленные сразу после друг друга, предшествовать друг другу?

Когда я объявляю, например, три переменные, как это:

int a = 0, b = 1, c = 2; 

Будет ли переменная есть адреса, которые предшествуют друг другу ... как когда адрес a концов, делает адрес b начала сразу?

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

Заранее благодарен

+0

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

+1

'Я не совсем понимаю, как работают компьютер, переменные и данные'. Чтобы понять это, изучите некоторые основы языка ассемблера. –

+0

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

ответ

2

Это зависит от компилятора, как он присваивает адрес переменной.

В вашем случае адрес может быть последовательным или может и не быть.

Вы можете просто проверить из кода, как:

#include"iostream" 

using namespace std; 

int main() 
{ 
    int a = 0, b = 1, c = 2; 

    cout<<"Address of A : "<<&a<<endl<<"Address of B : "<<&b<<endl<<"Address of C : "<<&c<<endl; 

    return 0; 
} 

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

Пример:

int *p_a = &a; 
int *p_b = &b; 
int *p_c = &c; 
+0

Итак, как я понимаю, массивы являются пространственными, потому что их адреса последовательны, я прав? BTW, спасибо за хороший ответ, я очень ценю :) – khajvah

+1

Ваш прием .... Да массив специальный, а переменная, хранящаяся в массиве, находится в последовательном адресе памяти. –

1

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

В любом случае - зачем беспокоиться?

+2

«Зачем беспокоиться?». Мягкое, академическое любопытство в отношении этих вещей хорошо для C и C++. Одним из основных преимуществ этих языков является то, что они предоставляют то, что вы в противном случае можете получить только в сборке. Знание этого материала хорошее. * Беспокойство об этом одержимо - проблема. –

+0

@AdrianRatnapala - Есть много документов по технологии компилятора. Напомним, что это - http://www.intel.com/content/dam/www/public/us/en/documents/technology-briefs/intel-labs-closing-ninja-gap-paper.pdf - но это не вопрос –

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