Указатели в C# для создания международного массива?

Следующие компиляции программы C++ и выполнения как ожидалось:

#include <stdio.h>

int main(int argc, char* argv[])
{
    int* test = new int[10];

    for (int i = 0; i < 10; i++)
            test[i] = i * 10;

    printf("%d \n", test[5]); // 50
    printf("%d \n", 5[test]); // 50

    return getchar();
}

Самый близкий простой пример C#, который я мог сделать для этого вопроса:

using System;

class Program
{
    unsafe static int Main(string[] args)
    {
        // error CS0029: Cannot implicitly convert type 'int[]' to 'int*'
        int* test = new int[10];

        for (int i = 0; i < 10; i++)
            test[i] = i * 10;

        Console.WriteLine(test[5]); // 50
        Console.WriteLine(5[test]); // Error

        return (int)Console.ReadKey().Key;
    }
}

Таким образом, как я делаю указатель?

8
задан y2k 30 March 2010 в 16:03
поделиться

3 ответа

C# - это не C++ - не ожидайте, что в C# будут работать те же вещи, которые работали в C++. Это другой язык, с некоторым вдохновением в синтаксисе.

В C++ доступ к массиву - это сокращение для манипуляций с указателями. Поэтому следующие действия:

test[5]
*(test+5)
*(5+test)
5[test]

Однако в C# это не так. 5[test] не является корректным в C#, поскольку в System.Int32 нет свойства indexer.

В C# вы очень редко хотите иметь дело с указателями. Лучше просто рассматривать его как массив int напрямую:

int[] test = new int[10];

Если вы действительно хотите иметь дело с математикой указателей по какой-то причине, вам нужно отметить ваш метод unsafe, и поместить его в fixed context. Это не было бы типично для C#, и это действительно, вероятно, что-то совершенно ненужное.

Если вы действительно хотите, чтобы это работало, самое близкое, что вы можете сделать в C#, это:

using System;

class Program
{
    unsafe static int Main(string[] args)
    {
        fixed (int* test = new int[10])
        {

            for (int i = 0; i < 10; i++)
                test[i] = i * 10;

            Console.WriteLine(test[5]); // 50
            Console.WriteLine(*(5+test)); // Works with this syntax
        }

        return (int)Console.ReadKey().Key;
    }
}

(Опять же, это действительно странный C# - не то, что я бы рекомендовал...)

30
ответ дан 5 December 2019 в 05:03
поделиться

Вам нужно закрепить массив с помощью ключевого слова fixed, чтобы он не был перемещен GC:

fixed (int* test = new int[10])
{
    // ...
}

Однако, небезопасный код в C# скорее исключение, чем правило. Я бы попытался перевести ваш код на C в небезопасный код на C#.

5
ответ дан 5 December 2019 в 05:03
поделиться

Вам нужно выучить язык C #. Хотя есть синтаксическое сходство с C / C ++, он, как и Java, имеет совершенно другой подход.

В C # объекты по умолчанию действуют как ссылки. То есть вам не нужно указывать синтаксис обращения к указателю (&) и разыменования (*).

0
ответ дан 5 December 2019 в 05:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: