typedef struct _Node
{
struct _Node *left, *right, *parent;
val_t value;
} Node;
Маленький вопрос
Изучаю Си, и в примере столкнулся с непонятной строкой :
Код:
Собственно, непонятна 3 (третья) строка. Не понимаю, как структура может содержать в себе, тип структуры на саму себя ? В общем, как работает 3 строка.
Прошу, помогите.
она содержит указатель. Это допустимо.
Извините, просто я не понимаю логики этого объявления.. Как указатели могут принять тип, в котором они сами же и объявлены ?
Просто проблема не в том что, что-то не работает, а в том, что я это не понимаю. Просто прошу объяснить это.. в учебнике это не объясняется.
Цитата: Buserandi
Извините, просто я не понимаю логики этого объявления.. Как указатели могут принять тип, в котором они сами же и объявлены ?
Просто проблема не в том что, что-то не работает, а в том, что я это не понимаю. Просто прошу объяснить это.. в учебнике это не объясняется.
опр. указателя - это переменная хранящая адрес области памяти.
причём совершенно всё равно, что находится по этому адресу число, массив, структура или функция.
почитай про то, как организуется память, тогда станет более понятна логика работы указателей(см. что такое смещение).
т.е. вообще говоря указатель это просто адрес ячейки памяти, а его тип указывает, что храниться в памяти по этому адресу...
поэтому можно делать вот такие финты ушами:
[SIZE="1"]не говоря уже об обычном указателе в структуре на саму себя[/SIZE]
допустим есть ф-ция():
Код:
int func(int a)
{
return a + 10;
}
{
return a + 10;
}
а это опр. указателя на функции с сигнатурой аналогичной func:
Код:
typedef int (*func_pointer) (int);
т.е. если написать:
Код:
func_pointer p = func;
int a = p(10);
int a = p(10);
то всё будет хорошо, а переменная a будет иметь значение 20.
но если сделать вот так:
Код:
int b = 20;
func_pointer q = (func_pointer) &b;
int c = q(20);
func_pointer q = (func_pointer) &b;
int c = q(20);
то на строке int c = q(20); произойдёт ошибка, т.к. по адресу, хранящемуся в q, вместо функции с сигнатурой func_pointer оказалось что то другое...
т.е. засунуть в указатель можно что угодно, но вот несоответствие содержимого памяти тому, что ожидается там увидеть чревато ошибками в программе.
Norgat, Спасибо вам большое. Я всё понял. Просто я на теме указатели в учебнике, облазил весь интернет и учебники, и думал что всё про указатели усвоил, ан нет...