Струны и структуры в с - PullRequest
       7

Струны и структуры в с

3 голосов
/ 10 августа 2011
#include "stdafx.h"
#include <stdio.h>

struct s 
{
  char *st;
  struct s *sp; 
};

struct s *p1,*p2;
void swap(struct s *p1,struct s *p2);

int main()
{
    int i;
    struct s *p[3];
    static struct s a[]={
        {"abc",a+1},{"def",a+2},{"ghi",a}
    };
    for(i=0;i<3;i++)
    {
     p[i]=a[i].sp;
    }
    swap(*p,a);
    printf("%s %s %s\n",p[0]->st,(*p)->st,(*p)->sp->st);
    return 0;
}
void swap(struct s *p1,struct s *p2)
{
    char *temp;
    temp = p1->st;
    p1->st = p2->st;
    p2->st = temp;
}

Эта программа выводит как abc, abc, ghi. Я сомневаюсь, что p [0] -> st, (* p) -> st, (* p) -> sp-> st output.we не инициализировали st с помощью abc или ghi. Как он выводит строку?

Ответы [ 2 ]

4 голосов
/ 10 августа 2011

Мы не инициализировали st с помощью abc или ghi.Как она выводит строку?

Значение элемента st для каждой структуры в статически размещенном массиве a фактически инициализируется через список инициализации.Запись

static struct s a[]={
    {"abc",a+1},{"def",a+2},{"ghi",a}
};

имеет то же эффективное значение после его выполнения, что и запись следующего:список struct s, где члены-данные каждого узла в списке (элемент st) указывают на строковый литерал, такой как «abc», «def» и т. д. Элемент данных sp указывает наследующий узел в связанном списке.

2 голосов
/ 10 августа 2011

Я не проанализировал все утверждения, но здесь происходит присвоение ->st и ->sp:

static struct s a[]={
    {"abc",a+1},{"def",a+2},{"ghi",a}
};

, остальное - игры с указателями, поэтому вы видите результат.Итак, скажем:

  1. массив a создан и инициализирован;

  2. в цикле for также инициализирован массив p;

  3. с замечанием, что sp рекурсивно указывает на struct s экземпляров, p и a имеют одинаковую структуру;

  4. каждый элемент p указывает на экземпляр struct s, взятый из одного из элементов a.

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