Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSharp_Prog_Guide.doc
Скачиваний:
16
Добавлен:
16.11.2019
Размер:
6.22 Mб
Скачать

Выражения указателей Получение значения переменной указателя

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

*p;

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

При применении косвенного оператора к указателю с нулевым значением результат зависит от конкретной реализации.

Пример

В следующем примере к переменной типа char получают доступы указатели различных типов. Обратите внимание, что адрес theChar будет изменяться в каждом случае, поскольку физический адрес переменной может изменяться.

----

How to: Obtain the Address of a Variable

To obtain the address of a unary expression, which evaluates to a fixed variable, use the address-of operator:

int number;

int* p = &number; //address-of operator &

The address-of operator can only be applied to a variable. If the variable is a moveable variable, you can use the fixed statement to temporarily fix the variable before obtaining its address.

It is your responsibility to ensure that the variable is initialized. The compiler will not issue an error message if the variable is not initialized.

You cannot get the address of a constant or a value.

Example

In this example, a pointer to int, p, is declared and assigned the address of an integer variable, number. The variable number is initialized as a result of the assignment to *p. If you make this assignment statement a comment, the initialization of the variable number will be removed, but no compile-time error is issued. Notice the use of the Member Access operator -> to obtain and display the address stored in the pointer.

// compile with: /unsafe

class AddressOfOperator

{

static void Main()

{

int number;

unsafe

{

// Assign the address of number to a pointer:

int* p = &number;

// Commenting the following statement will remove the

// initialization of number.

*p = 0xffff;

// Print the value of *p:

System.Console.WriteLine("Value at the location pointed to by p: {0:X}", *p);

// Print the address stored in p:

System.Console.WriteLine("The address stored in p: {0}", p->ToString());

}

// Print the value of the variable number:

System.Console.WriteLine("Value of the variable number: {0:X}", number);

}

}

Value at the location pointed to by p: FFFF

The address stored in p: 65535

Value of the variable number: FFFF

Получение адреса переменной

Чтобы получить адрес унарного выражения (которое оценивается как фиксированная переменная), используйте оператор address-of:

int number;

int* p = &number; //address-of operator &

Оператор address-of можно применять только к переменной. Если переменная является перемещаемой, можно использовать фиксированное предложение, чтобы временно зафиксировать переменную перед получением ее адреса.

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

Невозможно получить адрес константы или переменной.

Пример

В данном примере указатель на int, p объявляется и ему присваивается адрес целочисленной переменной number. Переменная number инициализируется в результате присвоения *p. Если в тексте кода закомментировать присвоение, то инициализация переменной number будет удалена, однако при компиляции не возникнет сообщений об ошибках. Обратите внимание на применение оператора доступа члена -> для получения и отображения адреса, хранящегося в указателе.

-----

How to: Access a Member with a Pointer

To access a member of a struct that is declared in an unsafe context, you can use the member access operator as shown in the following example in which p is a pointer to a struct that contains a member x.

CoOrds* p = &home;

p -> x = 25; //member access operator ->

Example

In this example, a struct, CoOrds, that contains the two coordinates x and y is declared and instantiated. By using the member access operator -> and a pointer to the instance home, x and y are assigned values.

Note:

Notice that the expression p->x is equivalent to the expression (*p).x, and you can obtain the same result by using either of the two expressions.

// compile with: /unsafe

struct CoOrds

{

public int x;

public int y;

}

class AccessMembers

{

static void Main()

{

CoOrds home;

unsafe

{

CoOrds* p = &home;

p->x = 25;

p->y = 12;

System.Console.WriteLine("The coordinates are: x={0}, y={1}", p->x, p->y );

}

}

}