Указатели в C # для создания массива int? - PullRequest
8 голосов
/ 30 марта 2010

Следующая программа на 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;
    }
}

Так как мне сделать указатель?

Ответы [ 3 ]

29 голосов
/ 30 марта 2010

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

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

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

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

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

int[] test = new int[10];

Если вы действительно хотите по какой-то причине иметь дело с математикой указателя, вам нужно пометить свой метод unsafe и поместите его в фиксированный контекст .Это не типично для 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 # - я бы не рекомендовал ...)

5 голосов
/ 30 марта 2010

Вам необходимо закрепить массив с помощью ключевого слова fixed, чтобы он не перемещался GC: * ​​1002 *

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

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

0 голосов
/ 30 марта 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...