структура без имени структуры - PullRequest
4 голосов
/ 02 сентября 2010

Структура, определенная ниже, не имеет имени структуры. Более того, я не могу получить часть массива. Заранее спасибо. Что означают значения в массиве структуры?

#include <stdio.h>
int main()
{
    struct
    {
        int x,y;
    } s[] = {10,20,15,25,8,75,6,2};
    int *i;
    i = s;

    clrscr();
    printf("%d\n",*(i+3));
    return 0;
}

Ответы [ 5 ]

10 голосов
/ 02 сентября 2010

Теперь у нас есть вопрос, на который можно ответить:

struct
{
    int x,y;
} s[] = {10,20,15,25,8,75,6,2};

Это объявляет массив с именем s анонимных структур.Каждая структура имеет два поля int.Размер массива не указан, поэтому он будет настолько большим, насколько это необходимо для хранения списка инициализаторов («список инициализаторов» - это технический термин для заключенного в скобки списка чисел после знака равенства).

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

struct
{
    int x,y;
} s[] = { {10,20}, {15,25}, {8,75}, {6,2} };

Каждая пара чисел в скобках инициализирует один элемент массива s.Первое число инициализирует x, а второе y.Итак, все это правда:

s[0].x == 10
s[0].y == 20
s[1].x == 15
s[1].y == 25

и т. Д.

4 голосов
/ 02 сентября 2010

Всякий раз, когда вам требуется ссылаться на struct не более одного раза, имеет смысл создать его переменную без присвоения ей имени.

Синтаксис достижения в С:

struct{
/*
.
.your structure members
.
*/
}<variable name>;

в вашем случае s это массив

struct 
   {
      int x,y;
   }
3 голосов
/ 02 сентября 2010

Не совсем ясно, что вы ожидаете увидеть в результате вывода кода, который вы разместили.Если вы ожидаете увидеть «25», то вы правы.Доступ к членам вашей структуры так, как вы пытаетесь это сделать, хотя и «действителен» в данном конкретном случае, может быть очень опасным, если вы точно не знаете, что делаете.Рассмотрите следующие незначительные изменения в вашей структуре:

struct
{
    int x;
    char y;
} s[] = {10,20,15,25,8,75,6,2};

Как вы думаете, что ваш код получит сейчас?Простой ответ «это зависит».На что, спросите вы?Размер char в выбранной вами архитектуре системы.Это обычно 8 бит, но это не гарантировано.ANSI C и C99 определяют char следующим образом:

"Объект, объявленный как тип char, достаточно велик для хранения любого члена базового набора символов выполнения."

Это также зависит от того, как ваш конкретный компилятор «выравнивает» элементы структуры.Компилятор обычно выравнивает элементы по границам слова, но, опять же, что это означает, зависит от размера слова.Структура также может быть выровнена по границам байтов.Дело в том, что есть лучшие способы доступа к данным в структурах.Рассмотрим:

#include    <stdio.h>

int main()
{
    struct
    {
        int x, y;
    } *ps, s[] = { {10, 20}, {5, 25}, {8, 75}, {6, 2} };

    ps = s;

    printf( "%d\n", *(ps + 3) );
    printf( "%d\n", s[3].x );
    printf( "%d\n", (ps + 3)->x );

    return 0;
}

В этом примере ps объявлен как указатель на безымянную структуру.После выполнения присваивания ps = s, ps указывает на первый элемент структуры.Если вы добавите 1 к ps, как в ps += 1;, это будет указывать на второй элемент структуры и так далее.Итак, в примере все три оператора printf печатают число 6. Вы понимаете, почему?В первом случае, *(ps + 3), как показано при добавлении к ps, мы продвигаем указатель через массив структур, чтобы он указывал на третий элемент.Во втором случае, s[3].x, мы ссылаемся на третий элемент в массиве структур s и принимаем значение x в этом элементе.Наконец, (ps + 3)->x, мы добавляем три к ps, как и раньше, разыменовывая его как указатель на наш тип структуры, мы берем значение x.

Также обратите внимание на способ, который я инициализировалs.Хотя внутренние скобки не требуются, они в хорошей форме.Если бы у вас была более сложная структура, было бы очень трудно выполнить правильную инициализацию без фигурных скобок, которые могли бы помочь в качестве руководства, а для кого-то, кто последует за ней, было бы невозможно прочитать.

2 голосов
/ 02 сентября 2010

в вашем объявлении структуры

, которое должно читаться как

   struct mystructTag
   {
      int x,y;
   }mystruct;
   mystructTag mystructlist[]={ {10,20}, {15,25}, {8,75}, {6,2} };

Спасибо vulkanino за указание на маленький блок!

2 голосов
/ 02 сентября 2010

У вас может быть безымянная структура, но, конечно, вы не можете повторно использовать ее тип. s - это массив структур, инициализированных непосредственно в объявлении.

Я сомневаюсь, что это правильный синтаксис.

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