2010-03-17 3 views
0
struct struct0 { 
    int a; 
}; 

struct struct1 { 
    struct struct0 structure0; 
    int b; 
} rho; 


&rho->structure0; /* Reference 1 */ 
(struct struct0 *)rho; /* Reference 2 */ 
(struct struct0)rho; /* Reference 3 */ 
  1. Из ссылки 1, делает компилятор взять адрес Rho, а затем получить доступ к structure0, или наоборот?Приоритет операторов и определение структуры в C

  2. Что делает линия при ссылке 2?

  3. Поскольку struct0 является первым членом struct1, ссылка 3 будет эквивалентна ссылке 1?

ответ

4

Для ваших ссылок:

  1. -> имеет более высокий приоритет, чем &. Вы получите адрес rho->structure0. Вернее, если бы вы указали rho. Поскольку это не так, вы получите ошибку компиляции.
  2. Это не сработает - вы создаете структуру типа указателя - вы должны получить ошибку компилятора.
  3. Вы тоже не можете этого сделать. Ошибка типа для нескалярного типа также является ошибкой.

Ваши примеры # 2 и # 3 покрыты стандартной секции 6.5.4:

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

Если вы поместите любой из этого кода в компилятор, вы увидите те же результаты; это код, который вы показываете не тем, о чем вы хотели спросить?

+0

Если первый член rho был указателем, будут ли ссылки 1 и 2 эквивалентными? – Yktula

+1

@Yktula, нет, они все равно не сработают. 'rho' сам должен быть указателем, чтобы попробовать любой из этих вещей. –

+0

Вы правы. struct s1 {struct {int n} * s0; } * s1; main() {(& s1-> sch == (struct s0 *) s1)? printf («Да»): exit (EXIT_FAILURE); return 0; } печатает Да. Спасибо. – Yktula

2
&rho->structure0; /* Reference 1 */ 
(struct struct0)rho; /* Reference 3 */ 
(struct struct0 *)rho; /* Reference 2 */ 

Все три ссылки не прав:

  • Rho не является указателем. Таким образом, вы не можете сделать rho->structure0 но (&rho)->structure0
  • Вы не можете преобразовать переменную в указатель, так что вы не можете сделать (struct struct0)rho; но (struct struct0 *)&rho

Я вполне реально не понимаю, что вы хотите сделать, так Я не могу вам помочь.