(+84) 236.3827111 ex. 402

Kiểu con trỏ trong C#


C# cũng hỗ trợ kiểu con trỏ như C++, đoạn mã lệnh sử dụng kiểu con trỏ, sẽ được đánh dấu không an toàn (unsafe)

Khai báo biến kiểu con trỏ như sau:

Kiểu* TênBiến;

void* TênBiến; //cho phép nhưng không nên dùng

Biến kiểu con trỏ không chứa giá trị mà chứa tham chiếu đến biến hay nói cách khác giá trị của biến con trỏ là địa chỉ của biến

Ví dụ

Mô tả

int* p

p là một con trỏ tham chiếu đến biến nguyên

int** p

p là một con trỏ tham chiếu đến con trỏ đến biến nguyên

int*[] p

p là một mảng của các con trỏ tham chiếu đến biến nguyên

char* p

p là con trỏ tham chiếu đến biến char

void* p

p là con trỏ tham chiếu đến biến kiểu void

Khi bạn khai báo nhiều con trỏ cùng kiểu, chỉ sử dụng một dấu * cho nhiều biến của cùng một khai báo, không sử dụng mỗi dấu * cho mỗi biến :

int* p1, p2, p3;

Toán tử * có thể được sử dụng để truy cập giá trị của biến được trỏ đến bởi biến con trỏ. Bạn không thể sử dụng toán tử * cho con trỏ kiểu void*, tuy nhiên có thể chuyển kiểu con trỏ void* đến bất kỳ kiểu con trỏ khác.

Bảng 2.2 Các phép toán thực hiện trên biến con trỏ

Phép toán

ý nghĩa

*

lấy giá trị của biến mà con trỏ tham chiếu đến

->

truy cập thành phần của cấu trúc struct được tham chiếu bởi con trỏ

[]

truy cập thành phần của mảng tham chiếu bởi con trỏ

&

lấy địa chỉ của biến

++ and --

phép toán tăng và giảm trên biến con trỏ

+ and -

thực hiện phép toán số học trên biến con trỏ

==, !=, <, >, <=, and >=

phép toán so sánh biến con trỏ

Ví dụ:

unsafe class TestClass

{

static void Main()

{

char theChar = 'Z';

char* pChar = &theChar;

void* pVoid = pChar;

int* pInt = (int*)pVoid;

int number;

int* p = &number;

*p = 0xffff;

System.Console.WriteLine("Địa chỉ của biến theChar = {0:X2}",

(int) pChar);

System.Console.WriteLine("Giá trị của biến pChar = {0}", *pChar);

System.Console.WriteLine("Giá trị của biến pInt = {0}", *pInt);

System.Console.WriteLine("Giá trị biến trỏ bởi con trỏ p:{0:X}", *p);

System.Console.WriteLine("Địa chỉ lưu trong biến p: {0}",

p->ToString());

System.Console.WriteLine("Giá trị của biến number: {0:X}", number);

p++;

System.Console.WriteLine("Giá trị biến trỏ bởi con trỏ p:{0:X}", *p);

}

}

Ví dụ:

using System;

struct Point

{

public int x, y;

}

class AccessMembers

{

static void Main()

{

Point home;

unsafe

{

Point* p = &home;

p->x = 25;

p->y = 12;

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

}

}

}

Ví dụ: Trong ví dụ sau, chú ý rằng biểu thức charPointer[i] tương đương với biểu thức *(charPointer + i)

using System;

class Pointers

{

unsafe static void Main()

{

char* charPointer = stackalloc char[123];

for (int i = 65; i < 123; i++)

charPointer[i] = (char) i;

Console.WriteLine("Uppercase letters:");

for (int i = 65; i < 91; i++)

Console.Write(charPointer[i]);

Console.WriteLine();

Console.WriteLine("Lowercase letters:");

for (int i = 97; i < 123; i++)

Console.Write(charPointer[i]);

}

}