Сомневайся с Указателями в договоренности Переменных Структуры

Мое сомнение: Porqué указатель const wDeck, что находится как параметр в функциях fillDeck, shuffle и deal, у него нет квадратных скобок в конце концов (а именно, это не указатель в договоренность в отличие от других параметров)?

Если предполагается, что этот указатель указывает на договоренность переменных структуры Card, Porqué, поместив ему квадратные скобки в параметры wDeck, программа представляет ошибки? И не сделав это: Программа прокручивает изображение в окне верно?

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <ctype.h>
#include <time.h>
#include <math.h>
#include <string.h>

/* Definition of the structure 'card' */
struct card
{
    const char *face;
    const char *suit;
}; /* End of the definition of the structure 'card'. */

typedef struct card Card;

void fillDeck(Card *const wDeck, const char *wFace[], const char *wSuit[]);
void shuffle(Card *const wDeck);
void deal(const Card *const wDeck);

int main()
{
    Card deck[52];

    /* Initialize the arrays of pointers */
    const char *face[] = {"Ace", "Deuce", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Jack", "Queen", "King"};
    const char *suit[] = {"Hearts", "Diamonds", "Clubs", "Spades"};

    srand(time(NULL));

    fillDeck(deck, face, suit);
    shuffle(deck);
    deal(deck);

    getch();
    return 0;
}

/* Place strings into Card structures. */
void fillDeck(Card *const wDeck, const char *wFace[], const char *wSuit[])
{
    int i;

    for(i=0; i<=51; i++)
    {
        wDeck[i].face = wFace[i % 13];
        wDeck[i].suit = wSuit[i / 13];
    }
}

void shuffle(Card *const wDeck)
{
    int i;
    int j;

    Card temp;

    for(i=0; i<=51; i++)
    {
        j = rand() % 2;
        temp = wDeck[i];
        wDeck[i] = wDeck[j];
        wDeck[j] = temp;
    }
}

void deal(const Card *const wDeck)
{
    int i;

    for(i=0; i<=51; i++)
    {
        printf("%5s of %-8s%s", wDeck[i].face, wDeck[i].suit, (i + 1) % 4 ? " " : "\n");

    }
}
2
задан 23.01.2017, 19:12
0 ответов

В C, TYPE[] и TYPE* с главным образом эквивалентные и взаимозаменяемые, как он показывает тебя ясно eferion в Вашем ответе.

Однако, твоя тревога proviede другой детали, косвенно связанный с предыдущим, но отличный. В этом коде

void fillDeck( Card *const wDeck, const char *wFace[], const char *wSuit[] );

wFace и sWuit они const char *а именно, они меткие в постоянные данные; ты можешь изменять сам указатель, но не можешь изменять остроконечную информацию. Выражение *wFace = XXX она была бы ошибочной, в то время как выражение wFace = XXX она была бы правильной.

wDeck, с другой стороны, это постоянный указатель в информацию. Сосредоточись на положении const, что не тот же самый, чем в предыдущих. Это означает, что ты Можешь изменять информацию, делая, например, *wDeck = XXX; то, что ты не можешь делать, состоит в том, чтобы изменять указатель в себе.

Сейчас, если ты добавляешь квадратные скобки

Card *const wDeck[]

Ввиду которого мы сказали, на котором указатели взаимозаменяемые с договоренностями, в действительности, составитель это видит:

Card *const Card *wDeck

Что тип, полностью отличный от оригинала, и что не согласовывается с в стоимость, которую ты пробуешь использовать, которую ты продолжаешь брать из переменной Card deck[52], и тип которого, следовательно, Card *.

1
ответ дан 03.12.2019, 17:32
  • 1
    ¡ Muchí пропасти спасибо! Я это понял верно... –  24.01.2017, 01:26

В C, простой указатель - только переменная, которая хранит ячейку запоминающего устройства:

int* puntero;

Когда мы хотим, чтобы указатель хранил коллекцию элементов, тогда мы перед договоренностью unidimensional или вектор. Если число элементов не является чрезмерно большим, мы можем предпочитать создавать это в батарейке:

int vector[100];

С предыдущим заявлением то, что мы получаем, состоит в том, чтобы размещать место для 100 элементов типа int. Различные элементы будут являться в положениях последующих памяти:

elem1 | elem2 | elem3 | ... | elem100

Ввиду этой функции у составителя нет необходимости помнить положение каждого элемента. Ему достаточно знать положение первого элемента и применять перемещение начиная с вышеупомянутого положения. Именно поэтому вектор сравнимый с простым указателем:

int vector[100];

int *puntero = vector; // ok

И, из-за расширения, когда мы звоним в функцию, которая допускает простые указатели, он не будет иметь значения для него, если вышеупомянутый указатель укажет на единственный элемент или на коллекцию тех же самых:

void func(int*);

int vector[100];
int *puntero = vector;

func(vector);  // ok
func(puntero); // ok

Относительно использования квадратных скобок он советовал бы тебе объяснять лучше, во что ты относишься... пример обоих случаев использования (с ошибкой и без ошибки).

0
ответ дан 03.12.2019, 17:32
  • 1
    Твой explicació n на relació n punteros <-> arreglos - очень хорошие и fá cil понимания . ¿ wiki сообщества? ¿ или спроси абзац, тип ¿ cual es la relación entre los punteros y los arreglos en C / C++ ?? –  24.01.2017, 11:56