分享
 
 
 

C#变量类型(1):指针

王朝c#·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

本课将简单介绍指针以及它在C#中的使用,不过本课程仅仅会涉及到一些指针方面的浅显知识,如果你对指针不是十分的熟悉,而你又偏偏希望在你的代码中使用指针,我们建议你更深入的了解它。幸运的是,在C#中只有当程序运行速度是极其重要的时候才需要使用到指针。(大多数情况下,我们可以不去理会指针。)

指针符号

指针是一个保存其他类型数据存储地址的变量。在C#中,指针只能指向值类型数据以及数组。

指针以如下的方式使用*隐式定义:

int *p;

有些程序员可能会把*直接放在类型名的后面,例如:int* p,这种定义指针的方式和前一种方式工作情况完全相同。

上面的定义将创建一个指针p。p将保存一个整数(占用4字节)的初始内存地址。

*p(在p前加上*前缀)这种复合语法元素可以用来代表由p指向的内存中存放的实际数据。因此如果给出声明后,*p能够出现在赋值号的左边,如下所示:

*p=5;

这行代码将5赋值给由上面的声明语句初始化的整数。不过,对于如下的赋值语句你可能会感到迷惑:

p=5;

这条语句的效果是改变p保存的内存地址,它并不会改变由初始化声明语句初始化的整数值。这仅仅意味着p将不再指向这个整数。事实上,p现在将指向由内存地址5开始的连续的4个字节(int类型占用的内存位数)。

使用指针的另一个重要的符号是地址运算符&,它会返回变量存储的内存地址。下面是使用这个符号的一个例子,这个例子创建了一个指向整型变量i的指针p:

int i = 5;

int *p;

p = &i;

在上面的代码的基础上,代码

*p=10;

将改变变量i的值为10。因为*p能被理解为保存在由p指向的内存中的整数。

对于指向结构类型的指针还有另外一个重要的符号->。我们可以声明一个指向结构类型的指针,如下所示:(下面的例子中使用到了’Coords’结构,后面的代码中还会使用到)

Coords x = new Coords();

Coords *y = &x;

然后我们可以使用定义的指针y访问x的一个公共成员(例如z)。我么可以使用如下的两种方式:

(*y).z;

y -> x;//使用到符号->

不安全代码

在C#中使用指针的一个主要问题是C#管理环境垃圾收集。在清理内存空间时,垃圾收集器可能在不加警告的情况下改变一个现存类型的存储位置。这时以前指向这个类型的指针将不能再指向它了。这样一种情况将会导致两种潜在的问题。其一,它可能危及到这个C#程序的运行;其二,它可能影响到其他程序的完整性。

正因为上述问题,C#限制指针只能使用在由程序员明确声明为’unsafe’的代码中。因为不安全代码潜在的恶意使用问题,包含不安全代码的程序仅仅当他们能被完全信任时才能运行。

针对垃圾收集器移动数据存储位置的问题,你可以使用’fixed’表达式声明一个指针。这将固定指针指向的数据的位置,这样这个数据的存储位置将保持固定不变,不受垃圾收集器的影响。不过,’fixed’语句只能使用在不安全代码中。

另外值得注意的是,任何在不安全代码中声明的值类型自动变为’fixed’,而且如果你对他们使用了’fixed’表达式,将会产生运行时错误。不过,这条规则并不适用于引用类型(数组)。

下面的代码给出了一个标记为’unsafe’的方法的例子,从前面的讲述中,我们知道第9行的指针p不能使用’fixed’语句声明,因为p指向的是一个已经在不安全代码中声明的结构类型c。

1.

using System;

2.

public struct Coords

3.

{

4.

int x;

5.

int y;

6.

unsafe public static void Main()

7.

{

8.

Coords c = new Coords();

9.

Coords *p = &c;

10.

{

11.

p->y = 6;

12.

(*p).x = 5;

13.

}

14.

Console.WriteLine(c.y);

15.

Console.WriteLine(c.x);

16.

}

17.

}

我们再看看下面的代码,在第8行的指针p必须使用’fixed’语句声明,因为它指向了一个不是在不安全代码段中声明的类型。

1.

using System;

2.

public struct Coords

3.

{

4.

int x;

5.

int y;

6.

unsafe public static void notMain(ref Coords c)

7.

{

8.

fixed (Coords *p = &c)

9.

{

10.

p->y = 6;

11.

(*p).x = 5;

12.

}

13.

Console.WriteLine(c.y);

14.

Console.WriteLine(c.x);

15.

}

16.

}

在上面给出的例子中,’unsafe’都是作为方法的修饰符,不过你也可以在一个代码段中使用它,下面的例子显示了这种用法:

1.

using System;

2.

public static void Main()

3.

{

4.

unsafe

5.

{

6.

Coords c = new Coords();

7.

[...]

8.

}

9.

}

指针、方法和数组

虽然在上面的讲述中我们使用的指针都是指向一个值类型,但是指针也可以指向数组(引用类型)。(也有一些作者认为指针也可以指向字符串)

指针可以像下面的示例那样声明为指向一个数组:

int[] a = {4, 5};

int *b = a;

在这种情况下,b保存的内存地址是数组a的第一个元素的位置。正如前所述,这个元素必须是一个值类型。下面的代码显示了如何使用一个指针改变数组的各个元素的值,对此的解释不在本文讨论范围之列。

1.

using System;

2.

public class Tester

3.

{

4.

public static void Main()

5.

{

6.

int[] a = {4, 5};

7.

changeVal(a);

8.

Console.WriteLine(a[0]);

9.

Console.WriteLine(a[1]);

10.

}

11.

12.

public unsafe static void changeVal(int[] a)

13.

{

14.

fixed (int *b = a)

15.

{

16.

*b = 5;

17.

*(b + 1) = 7;

18.

}

19.

}

20.

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有