c# 中的指针相关问题

wolf_life 2009-06-08 06:02:26
我在项目中遇到这样一个问题。
在调用第三方接口(c++ 开发的)时,我要得到一个用户名数组, 但接口中只给提供了一个指针地址,第三方的技术支持让我根据地址找用户名数组。单个用户名类型为Const char *。

请问大家,该如何获取这个数组。
我没有做过c#中的指针操作。

还有。他们说根据指针地址,返回的是一个二维char型数组
...全文
67 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
bwangel 2009-06-09
  • 打赏
  • 举报
回复
直接用String类型的变量就可以了
ReachZh 2009-06-09
  • 打赏
  • 举报
回复
帮顶
四更山吐月 2009-06-09
  • 打赏
  • 举报
回复
把代码贴出来,搞定。
enaking 2009-06-09
  • 打赏
  • 举报
回复
先mark,回去给你答案,,我有示例,,
wolf_life 2009-06-09
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 angel6709 的回复:]
Char*就是String
[/Quote]


你好。。能不能就此问题给点思路。。


Char*就是String。。Char*也可以是StringBuilder 。。
angel6709 2009-06-09
  • 打赏
  • 举报
回复
Char*就是String
outou 2009-06-09
  • 打赏
  • 举报
回复
很难呀
zhangyanyang 2009-06-09
  • 打赏
  • 举报
回复
sf
CGabriel 2009-06-09
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 wolf_life 的回复:]
引用 1 楼 zgke 的回复:
使用StringBuilder 看看.

有使用StringBuilder 的实例吗?
[/Quote]

原版


BOOL GetPrivateProfileStruct(
LPCTSTR lpszSection,
LPCTSTR lpszKey,
LPVOID lpStruct,
UINT uSizeStruct,
LPCTSTR szFile
);


C# 使用 StringBuilder 版本


[DllImport("kernel32.dll")]
public static extern long GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int Size, string filePath);
wolf_life 2009-06-09
  • 打赏
  • 举报
回复
UserNames Long 32 用户名的数组指针。用户名的类型为Const char *

这个就是返回参数的说明。。
wolf_life 2009-06-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 qqqwwwqw 的回复:]
private unsafe void Convert(int* point,int length){
int p = (int)(point);
char[] des = new char[length];
Marshal.Copy((IntPtr)a, des, 0, length);
}
[/Quote]


兄弟。。
这个我怎么显示我要得到的用户名列表呢。。

你这样只是一个char数组。再给我点建议啊。
优途科技 2009-06-09
  • 打赏
  • 举报
回复
wolf_life 2009-06-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ChrisAK 的回复:]
加上unsafe就能直接用指针了.
至于二维数组...你可能要做下二维下标到一维下标的换算.
[/Quote]

听起来很复杂。。怎么换算啊
wolf_life 2009-06-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zgke 的回复:]
使用StringBuilder 看看.
[/Quote]


有使用StringBuilder 的实例吗?
wolf_life 2009-06-09
  • 打赏
  • 举报
回复
谢谢大家的回复,,
数组长度可以知道。有另一个参数表示数组的长度

大家给了不少意见,但我还是不知道怎么下手,希望大家给点参考代码。。
wartim 2009-06-09
  • 打赏
  • 举报
回复
而且可能name[..]这种写法不是很安全,没仔细测过,虽然结果是对的,c#里对指针的操作不是很明晰
wartim 2009-06-09
  • 打赏
  • 举报
回复
。。。只是一些地址,不用分配10000这么多
  • 打赏
  • 举报
回复
IntPtr
wartim 2009-06-09
  • 打赏
  • 举报
回复
额。。为了防止内存泄漏,最后还要加
Marshal.FreeHGlobal((IntPtr)Names);
wartim 2009-06-09
  • 打赏
  • 举报
回复
那你必须知道名字长度啊,这样才能对指针加偏移量,

这代码运行前先要项目属性里设置允许不安全代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace WindowsApplication48
{
unsafe public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();

char** Names = (char**)Marshal.AllocHGlobal(10000);

Names[0] = (char*)Marshal.UnsafeAddrOfPinnedArrayElement("小李".ToCharArray(), 0);
Names[1] = (char*)Marshal.UnsafeAddrOfPinnedArrayElement("小王".ToCharArray(), 0);
Names[2] = (char*)Marshal.UnsafeAddrOfPinnedArrayElement("小张".ToCharArray(), 0);

char* p = Names[0];
ShowName(p);
p += Names[1] - Names[0];
ShowName(p);
p += Names[2] - Names[1];
ShowName(p);
}

void ShowName(char* p)
{
MessageBox.Show(Marshal.PtrToStringAuto(new IntPtr(p)));
}
}
}
加载更多回复(9)

110,537

社区成员

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

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

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