一个简单的问题!!!在C中的指针类型在C#中是什么类型呀

franklitian 2003-09-13 06:40:07
在C中的指针类型在C#中是什么类型呀
...全文
219 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Geoffrey1975 2003-09-14
  • 打赏
  • 举报
回复
可惜的是C#中就算你得到了这个地址,好像也不能直接存取内存地址里面的内容。能够表示指针,但是不能作为指针的功能吧?unsafe功能我没用过,我也没用过IntPtr功能,请指教。
我通常都是用引用和代表来实现类似C指针的功能的。
chainet 2003-09-14
  • 打赏
  • 举报
回复
C中的指针就是记录保存地址的空间,一般桌面电脑用的CPU都是32bit寻址两个字节)。从386开始就是32位的啦,486,Pentium,II,III,4都是32bit,不过最新的AMD的Athron64就是64bit寻址了,扯远了。
因此任何一个占用32位bit的数据类型都可以保存指针。
在C#中int数据类型就是32位的,因此一般也就用int来表示指针。同样只要是32位的数据类型都基本都可以用来表示指针。
当然,C#还提供了一个转本用来表示指针的数据类型——IntPtr,可以更清楚的表示指针。
pcnetman 2003-09-14
  • 打赏
  • 举报
回复
“指针类型”可表示为“非托管类型”后跟一个 * 标记,
或者关键字 void 后跟一个 * 标记:
指针类型中,在 * 前面指定的类型称为该指针类型的目标类型。
它表示该指针类型的值所指向的变量的类型。

与引用(引用类型的值)不同,
指针不受垃圾回收器跟踪(垃圾回收器不了解指针和它们指向的数据)。
出于此原因,不允许指针指向引用或者包含引用的结构,
并且指针的目标类型必须是非托管类型。

“非托管类型”是任何不是“引用类型”并且在任何嵌套级别都不包含
“引用类型”字段的类型。换句话说,“非托管类型”是下列类型之一:

sbyte、byte、short、ushort、int、uint、long、ulong、char、float、
double、decimal 或 bool。
任何“枚举类型”。
任何“指针类型”。
任何由用户定义的只包含“非托管类型”字段的“结构类型”。
将指针和引用进行混合使用时的基本规则是;引用(对象)的目标可以包含指针,
但指针的目标不能包含引用。

与 C 和 C++ 不同,在 C# 中,当在同一声明中声明多个指针时,*
只与基础类型写在一起,而不充当每个指针名称的前缀标点符号。例如

int* pi, pj; // NOT as int *pi, *pj;
类型为 T* 的一个指针的值表示类型为 T 的一个变量的地址。
指针间接寻址运算符 * 可用于访问此变量。例如,假设具有

int* 类型的变量 P,则表达式 *P 表示一个 int 变量,该变量的地址就是 P 的值。

与对象引用类似,指针可以是 null。如果将间接寻址运算符应用于 null 指针,
则其行为将由实现自己定义。值为 null 的指针表示为将该指针的所有位都置零。

void* 类型表示指向未知类型的指针。由于目标类型是未知的,
间接寻址运算符不能应用于 void* 类型的指针,也不能对这样的指针执行任何算术运算。
但是 void* 类型的指针可以强制转换为任何其他指针类型(反之亦然)。

指针类型是一个单独类别的类型。与引用类型和值类型不同,指针类型不从 object 继承,
而且不存在指针类型和 object 之间的转换。
具体说来,指针不支持装箱和取消装箱。
但是,允许在不同指针类型之间以及指针类型与整型之间进行转换。

虽然指针可以作为 ref 或 out 参数传递,但这样做可能会导致未定义的行为,
例如,指针可能被设置为指向一个局部变量,而当调用方法返回时,
该局部变量可能已不存在了;或者指针曾指向一个固定对象,但当调用方法返回时,
该对象不再是固定的了。例如:

using System;
class Test
{
static int value = 20;
unsafe static void F(out int* pi1, ref int* pi2) {
int i = 10;
pi1 = &i;
fixed (int* pj = &value) {
// ...
pi2 = pj;
}
}
static void Main() {
int i = 10;
unsafe {
int* px1;
int* px2 = &i;
F(out px1, ref px2);
Console.WriteLine("*px1 = {0}, *px2 = {1}",
*px1, *px2); // undefined behavior
}
}
}

方法可以返回某一类型的值,而该类型可以是指针。例如,
给定一个指向连续的 int 值序列的指针、该序列的元素个数,
和另外一个 int 值 (value),下面的方法将在该整数序列中查找与该 value 匹配的值,
若找到匹配项,则返回该匹配项的地址;否则,它将返回 null:

unsafe static int* Find(int* pi, int size, int value) {
for (int i = 0; i < size; ++i) {
if (*pi == value)
return pi;
++pi;
}
return null;
}
realsnow 2003-09-14
  • 打赏
  • 举报
回复
我也想了解unsafe功能,请chainet讲一下或是给段源码看看
hhren 2003-09-14
  • 打赏
  • 举报
回复
讲清楚一点吗?我是初学者!
Geoffrey1975 2003-09-13
  • 打赏
  • 举报
回复
像要得到类似指针的功能,可以使用引用类型。通过装箱和拆箱的方法来传递对象。(比指针麻烦,但是安全的代码)
对于函数指针,对应的功能应该通过代表delegate来实现。
xz_king 2003-09-13
  • 打赏
  • 举报
回复
有指针
lustful 2003-09-13
  • 打赏
  • 举报
回复
在unsafe下可以使用指针
changezhong 2003-09-13
  • 打赏
  • 举报
回复
我记到在C#中没有指针类型的变量,这点和C,C++是不同的
webq 2003-09-13
  • 打赏
  • 举报
回复
晕,C#里就是没有指针啊
tpwang 2003-09-13
  • 打赏
  • 举报
回复
晕,C#里就是没有指针啊
xz_king 2003-09-13
  • 打赏
  • 举报
回复
应该和C++中的一样。 无符号整型。
zhangxuanbird 2003-09-13
  • 打赏
  • 举报
回复
没有
raulredondo 2003-09-13
  • 打赏
  • 举报
回复
在大多数情况下,句柄可以代替指针的作用
jiezhi 2003-09-13
  • 打赏
  • 举报
回复
no

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧