Передача ссылкой через несколько функций

Я не знаю ваше приложение, потому что вы новичок в StackOverflow, поэтому я изменил некоторый код для вашей карты в случайном порядке. Я удалил дублирование enum, а также добавил метод отображения в классе Card. Я сгенерировал случайное число из заданного диапазона с проверкой повторения. Я надеюсь, что это сработает для вас.

public enum SuitEnum
{
    Hearts,
    Diamonds,
    Clubs,
    Spades
}

public enum ValueEnum
{
    Ace = 1,
    Two = 2,
    Three = 3,
    Four = 4,
    Five = 5,
    Six = 6,
    Seven = 7,
    Eight = 8,
    Nine = 9,
    Ten = 10,
    Jack = 11,
    Queen = 12,
    King = 13
}

public class Card
{       
    SuitEnum Suit { get; set; }
    ValueEnum Value { get; set; }

    public Card(SuitEnum cardSuit, ValueEnum cardValue)
    {
        Suit = cardSuit;
        Value = cardValue;
    }

    public string Display()
    {
        return Suit + "" + Value.ToString();
    }
}

    public class Deck
    {
        public List<Card> Cards { get; set; }

        public Deck()
        {
            Random rand = new Random();
            Cards = new List<Card>();
            List<int> possibleSuit = Enumerable.Range(1, 4).ToList();
            List<int> listNumberSuite = new List<int>();
            for (int i = 0; i < 4; i++)
            {
                int index = rand.Next(0, possibleSuit.Count);
                listNumberSuite.Add(possibleSuit[index]);

                SuitEnum suit = (SuitEnum)possibleSuit[index];
                possibleSuit.RemoveAt(index);
                List<int> possibleDeck = Enumerable.Range(1, 13).ToList();
                List<int> listNumberDeck = new List<int>();

                for (int j = 0; j < 13; j++)
                {
                    int indexDeck = rand.Next(0, possibleDeck.Count);
                    listNumberDeck.Add(possibleDeck[indexDeck]);

                    ValueEnum deck = (ValueEnum)possibleDeck[indexDeck];
                    Cards.Add(new Card(suit, deck));

                    possibleDeck.RemoveAt(indexDeck);
                }
            }
            foreach (Card c in Cards)
            {
                Console.WriteLine(c.Display());
            }
        }
    }
5
задан inspectorG4dget 11 October 2012 в 15:10
поделиться

5 ответов

Просто использование:

bar(x, y, z);

X, Y, и Z уже являются указателями - просто передают их непосредственно.

Помните - указатель является местоположением в памяти. Местоположение не изменяется. При разыменовании указателя (использующий *x =...), Вы устанавливаете значение в том местоположении. Но когда Вы передаете его в функцию, Вы просто передаете местоположение в памяти. Можно передать то же самое местоположение в другую функцию, и это хорошо работает.

11
ответ дан 18 December 2019 в 08:31
поделиться

В foo_function x y и z уже являются указателями (интервал*), таким образом, можно сделать панель (x, y, z).

2
ответ дан 18 December 2019 в 08:31
поделиться

Вы ничего не должны делать, они уже - ссылки.

int foo_function(int* x,  int* y, int* z) {
  bar(x, y, z);
  return 0;
}

int bar(int* x, int* y, int* z) {
  //some stuff
}
2
ответ дан 18 December 2019 в 08:31
поделиться
int foo_function(int* x,  int* y, int* z) {
   *x = *y * *z;
   /* x, y and z are pointers to int
      &x, &y and &z are pointers to pointer to int
      bar expects pointers to int, so call bar as:
   */
   bar(x, y, z);
   return 0;
}
2
ответ дан 18 December 2019 в 08:31
поделиться

C не имеет никакого понятия передачи ссылкой. Параметры всегда передаются значением. Однако при использовании указателей, это значение является на самом деле указателем на фактическое значение.

Но с чем Вы делаете

foo_function(&x, &y, &z);

на самом деле пытается получить адрес указателя, который чрезвычайно бессмыслен (Вы передали бы int** вместо int*).

Так,

foo_function(x, y, z);

был бы корректный вызов, как x, y и z уже указатели, и Вы не должны делать указывающую цепочку больше :)

2
ответ дан 18 December 2019 в 08:31
поделиться
Другие вопросы по тегам:

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