1

I have been investigating C-style pointers in Visual Basic .NET for a while now. I have come across http://support.microsoft.com/kb/199824?wa=wsignin1.0 but I have no idea if that is the right thing or how to apply it. I have written a simple pointer using program in c and I would like it converted line for line into Visual Basic with comments wherever necessary. Here's the C:

int main()
{
    int *myNumber=3; //the * means it's a pointer

    doubleIt(*myNumber); //we use the void, the * means it returns a value not address
    printf("%d",myNumber); //we print the variable

    return 0; //we terminate the function
}

void doubleIt(int input)
{
    input*=2; //double the input
}
4

2 に答える 2

5

Cコードにはいくつかの問題があり、そのうちの1つは次のとおりです。

int *myNumber=3; //the * means it's a pointer  

最初にメモリを割り当てずに、そのようなポインタに値を割り当てることはできません。

したがって、次のようにします。

int* myNumber = malloc(sizeof(int));
*myNumber  = 3;
free(myNumber);

VB.NETにはポインタの概念がありません。すべて(つまり、every Object)は参照であり、Interopを使用せずに取得するポインターにほぼ近いものです。相互運用を行う必要がある場合はIntPtr、ポインター型を表すために使用できる型があります。

VB.NETプログラムは次のようになります:(構文が正確に正しくない場合はご容赦ください。しばらく経ちました)

Sub Main
    Dim myNumber As Integer = 3
    doubleIt(myNumber)
    Console.WriteLine(myNumber)
End Sub

Sub doubleIt(ByRef val As Integer)
    val *= 2
End Sub
于 2012-12-04T16:38:50.730 に答える
1

.NETには、2種類のオブジェクトタイプがあります。参照型(Class)と値型(Structure)があります。.NETでは、変数ごとに、その変数がポインターであるかどうかを判断する代わりに、すべての参照型オブジェクトは常にポインターのように扱われ、すべての値型オブジェクトはそうではありません。したがって、たとえば:

'Create one object of each type
Dim builder As New StringBuilder()  'Reference type
Dim size As Integer  'Value type

'Make a "copy" of each
Dim copyBuilder As StringBuilder = builder
Dim copySize As Integer = size

'Change the value of the original object
builder.Append("Test")
size = 33

'Check if the "copy" changed
Console.WriteLine("{0} = {1}", builder.ToString(), copyBuilder.ToString())
Console.WriteLine("{0} <> {1}", size, copySize)

そのコードを実行すると、次のように出力されます。

Test = Test
33 <> 0

したがって、ご覧のとおり、オブジェクトはStringBuilderポインタのように機能しますが、Integerオブジェクトはそうではありません。ただし、Tonyが指摘したように、値型を使用する場合でも、「参照によって」値をメソッドに渡すことができます。メソッドがそのパラメーターの1つがではByRefなくであると指定する場合ByVal、それはメソッドが変数の値を内部的に変更する可能性があり、その変更が呼び出し元のコードの変数に影響を与えることを意味します。

また、ボクシングとアンボクシングについて調査することもできます。

于 2012-12-04T17:06:01.333 に答える