указатель А может быть повторно присвоен:
int x = 5;
int y = 6;
int *p;
p = &x;
p = &y;
*p = 10;
assert(x == 5);
assert(y == 10);
ссылка А не может и должна быть присвоена при инициализации:
int x = 5;
int y = 6;
int &r = x;
указатель А имеет свой собственный адрес памяти и размер на стеке (4 байта на x86), тогда как ссылка совместно использует тот же адрес памяти (с исходной переменной), но также и занимает некоторое место на стеке. Так как ссылка имеет тот же адрес как сама исходная переменная, безопасно думать о ссылке как о другом названии той же переменной.Примечание: Какой указатель указывает на, может быть на стеке или "куче". Так же ссылка. Мое требование в этом операторе не состоит в том, что указатель должен указать на стек. Указатель является просто переменной, которая содержит адрес памяти. Эта переменная находится на стеке. Так как ссылка имеет свое собственное пространство на стеке, и так как адрес совпадает с переменной, на которую это ссылается. Больше на [1 115] стек по сравнению с "кучей" . Это подразумевает, что существует действительный адрес ссылки, которую компилятор не скажет Вам.
int x = 0;
int &r = x;
int *p = &x;
int *p2 = &r;
assert(p == p2);
у Вас могут быть указатели на указатели на указатели, предлагающие дополнительные уровни абстракции. Принимая во внимание, что ссылки только предлагают один уровень абстракции.
int x = 0;
int y = 0;
int *p = &x;
int *q = &y;
int **pp = &p;
pp = &q;//*pp = q
**pp = 4;
assert(y == 4);
assert(x == 0);
Указатель может быть присвоен nullptr
непосредственно, тогда как ссылка не может. Если Вы достаточно стараетесь, и Вы знаете, как, можно сделать адрес ссылки nullptr
. Аналогично, если Вы достаточно стараетесь Вас, может иметь ссылку на указатель, и затем что ссылка может содержать nullptr
.
int *p = nullptr;
int &r = nullptr; <--- compiling error
int &r = *p; <--- likely no compiling error, especially if the nullptr is hidden behind a function call, yet it refers to a non-existent int at address 0
Указатели могут выполнить итерации по массиву, можно использовать ++
для движения в следующий объект, на который указатель указывает, и + 4
для движения в 5-й элемент. Это, неважно, каким размером объект состоит в том, что указатель указывает на.
указатель А должен быть разыменован с [1 111] для доступа к ячейке памяти, на которую он указывает, тогда как ссылка может использоваться непосредственно. Указатель на класс/структуру использует ->
для доступа, это - участники, тогда как ссылка использует .
.
указатель А является переменной, которая содержит адрес памяти. Независимо от того, как реализована ссылка, ссылка имеет тот же адрес памяти как объект, на который это ссылается.
Ссылки не могут быть наполнены в массив, тогда как указатели могут быть (Упомянуты пользователем @litb)
, ссылки Константы могут быть связаны с временными файлами. Указатели не могут (не без некоторой косвенности):
const int &x = int(12); //legal C++
int *y = &int(12); //illegal to dereference a temporary.
Это делает const&
более безопасный для использования в списках аргументов и т.д.
Есть несколько вещей, которые могут привести к тому, что он не сработает.
Это событие, которое следует переопределить и использовать.
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
}
Я наткнулся на это, и, похоже, вы можете установить AutoEventWireup в Web.Config и Machine.Config. http://support.microsoft.com/kb/324151
Так что, возможно, в файле machine.config на этом сервере что-то происходит.
Стоит посмотреть.
<configuration>
<system.web>
<pages autoEventWireup="true|false" />
</system.web>
</configuration>