2014-02-19 3 views
2

Я изучаю C в одном из моих классов. В одной из моих лабораторий нам нужно использовать массив структур.Почему указатель на указатель может вести себя как массив?

Один из моей лаборатории Тас сказал мне, что я должен использовать массив как это:

typedef struct person { 

    int age; 
    char *name; 

} Person; 

int main() { 

    Person **people = (Person **)malloc(sizeof(Person *)); 

    Person *personA = (Person *)malloc(sizeof(Person)); 
    personA->age = 18; 
    personA->name = "LeBron James"; 

    Person *personB = (Person *)malloc(sizeof(Person)); 
    personB->age = 20; 
    personB->name = "Kobe Bryant"; 

    Person *personC = (Person *)malloc(sizeof(Person)); 
    personC->age = 21; 
    personC->name = "Michael Jordan"; 

    people[0] = personA; 
    people[1] = personB; 
    people[2] = personC; 

    printf("Name of first person is %s \n", people[0]->name); 
    printf("Name of second person is %s \n", people[1]->name); 
    printf("Name of second person is %s \n", people[2]->name); 

Результат прав. Но что я не понимаю, почему указатель на указатель (people) может вести себя как массив? (например, people[0] = personA)

Может кто-нибудь, пожалуйста, объясните это мне?

+0

Этот код является полностью неправильным. Не слушайте эту ТА. – SLaks

+1

@Slaks, это не правильный способ сделать это, но это не совсем неправильно .. – UldisK

+0

Указатель на указатель ведет себя как массив строк –

ответ

3

Это работает, потому что это в основном синтаксический сахар. Стандарт ANSI определяет его:

Определение оператора индекса [] является то, что E1 [E2] идентично (* (E1 + (E2)))

Таким образом, вы можете использовать оператор разыменования *a для поиска определенного элемента по адресу или оператора a[b] для просмотра b-го элемента a.

Ваш пример кода, как уже указывали другие, совершенно неправильный.

+0

Это имеет смысл. Дополнительный вопрос: при использовании этого способа, как мы знаем размер этого «массива»? Как мы знаем, сколько людей было сохранено? –

+0

@RoyLi, вы * не делаете *, если не можете найти вызов 'malloc'. –

+0

@RoyLi Либо вы сохраняете его где-то вместе с вашим «массивом», либо вам нужно найти место, где распределяется память. –

1
Person **people = (Person **)malloc(sizeof(Person *)); 

должен быть

Person **people = (Person **)malloc(sizeof(Person *) * 3); 

В противном случае, если вы сделаете это

people[0] = personA; 
people[1] = personB; 
people[2] = personC; 

Вы пишете 8 байт данных (предполагается, что 32-бит) за то, что было выделено.

Причина, по которой вы используете использовать указатели, такие как массивы, потому что они более или менее одно и то же, особенно в прямолинейном C.

, например:

int* numberlist = malloc(sizeof(int) * 10) 

и

int numberlist[10]; 

доступны таким же образом. Единственное различие заключается в том, как распределяется память.

Смежные вопросы