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]);
}
}
» Tin mới nhất:
» Các tin khác: