Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Маленький вопрос

62K
20 августа 2010 года
Buserandi
3 / / 20.08.2010
Здравствуйте.

Изучаю Си, и в примере столкнулся с непонятной строкой :

 
Код:
typedef struct _Node
   {
           struct _Node *left, *right, *parent;
           val_t value;
   } Node;

Собственно, непонятна 3 (третья) строка. Не понимаю, как структура может содержать в себе, тип структуры на саму себя ? В общем, как работает 3 строка.

Прошу, помогите.
1
20 августа 2010 года
kot_
7.3K / / 20.01.2000
она содержит указатель. Это допустимо.
62K
21 августа 2010 года
Buserandi
3 / / 20.08.2010
Ответ :kot_

Извините, просто я не понимаю логики этого объявления.. Как указатели могут принять тип, в котором они сами же и объявлены ?
Просто проблема не в том что, что-то не работает, а в том, что я это не понимаю. Просто прошу объяснить это.. в учебнике это не объясняется.
2.1K
21 августа 2010 года
Norgat
452 / / 12.08.2009
Цитата: Buserandi

Извините, просто я не понимаю логики этого объявления.. Как указатели могут принять тип, в котором они сами же и объявлены ?
Просто проблема не в том что, что-то не работает, а в том, что я это не понимаю. Просто прошу объяснить это.. в учебнике это не объясняется.



опр. указателя - это переменная хранящая адрес области памяти.
причём совершенно всё равно, что находится по этому адресу число, массив, структура или функция.
почитай про то, как организуется память, тогда станет более понятна логика работы указателей(см. что такое смещение).

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

поэтому можно делать вот такие финты ушами:
[SIZE="1"]не говоря уже об обычном указателе в структуре на саму себя[/SIZE]

допустим есть ф-ция():

 
Код:
int func(int a)
{
    return a + 10;
}


а это опр. указателя на функции с сигнатурой аналогичной func:
 
Код:
typedef int (*func_pointer) (int);


т.е. если написать:
 
Код:
func_pointer p = func;
int a = p(10);


то всё будет хорошо, а переменная a будет иметь значение 20.
но если сделать вот так:

 
Код:
int b = 20;
func_pointer q = (func_pointer) &b;
int c = q(20);


то на строке int c = q(20); произойдёт ошибка, т.к. по адресу, хранящемуся в q, вместо функции с сигнатурой func_pointer оказалось что то другое...

т.е. засунуть в указатель можно что угодно, но вот несоответствие содержимого памяти тому, что ожидается там увидеть чревато ошибками в программе.
62K
21 августа 2010 года
Buserandi
3 / / 20.08.2010
Norgat, Спасибо вам большое. Я всё понял. Просто я на теме указатели в учебнике, облазил весь интернет и учебники, и думал что всё про указатели усвоил, ан нет...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог