2016-04-19 1 views
2

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

#include<stdio.h> 
int main(void) 
{ 
    struct intPtrs 
    { 
    int *p1; 
    int *p2; 
    }; 

    struct intPtrs pointers; 
    int i1=100,i2; 

    pointers.p1=&i1; 
    pointers.p2=&i2; 

    *pointers.p2=-97; //here 

    printf ("i1 = %i, *pointers.p1 = %i\n", i1, *pointers.p1); 
    printf ("i2 = %i, *pointers.p2 = %i\n", i2, *pointers.p2); 
    return 0; 

} 

мой вопрос в приведенном выше коде, поскольку pointers объявлен как тип struct intPtrs, следует не выше код выглядеть pointers.(*p1) = -97;. Кроме того, я знаю, что это неправильно, потому что это дает мне ошибку. но я не могу понять, почему это *pointers.p1.

Вышеупомянутый вопрос может показаться наивным, но, пожалуйста, я стараюсь изо всех сил разобраться в своих концепциях. поэтому любая помощь в попытке объяснить это как можно проще, была бы очень полезной для меня.

+0

Какая ошибка дает вам это? – EOF

+1

Указатель 'p1' является членом структуры и вы получаете доступ к нему как' pointers.p1'. Чтобы разыменовать его, вы используете оператор '*', например '* (pointers.p1)'. Учитывая приоритет оператора, скобки не нужны. –

+2

Нет никакой разницы между указателем в 'struct' и указателем в другом месте. У вас возникла проблема с преувеличением оператора. – Olaf

ответ

4

Посмотрите на precedence table.

В вашем коде p2 является переменной-членом. Способ доступа к нему - через оператор доступа члена структурной переменной. Итак, pointers.p2 - это выражение, которое необходимо на самом деле Доступp2.

Теперь, приступив к синтаксису, оператор доступа к члену (.) имеет более высокий приоритет по отношению к косвенности (*). так, для утверждения,

*pointers.p2=-97; //here 

эквивалентно

*(pointers.p2) = 97; //here 

, который в основном говорит, доступ к элементу p2 корпусного переменной pointers и разыменования его.

OTOH, если вы попробуете что-нибудь вроде *p2, это будет недействительным, потому что нет переменной с именем p2, которая может быть отменена.

+0

Причина для downvote , кто-нибудь? –

+0

Не downvoter, но приоритет оператора на самом деле не вещь в C++. Может быть, это тоже не так, как в C? – SergeyA

+0

@SergeyA Я не уверен, что понимаю ... вы хотели бы уточнить? –

-1

В C++ синтаксис pointers.*p1 будет использоваться с указателем на элемент. Однако C не имеет указателей на членов.

+0

Я не вижу, как это будет работать на самом деле. На каком языке вы знаете такой синтаксис? «Указатель на член» на самом деле будет таким же, как «указатель на type_of_member» – Olaf

+0

@ Олаф, мои плохие, скопированные партименты, где они не нужны. И нет, указатель на член ** не ** совпадает с указателем на тип члена. – SergeyA

+0

@SergeyA: Хм, я думаю, вы имеете в виду что-то вроде 'struct s {int i, j} st;' '* (int *) ((char *) & st + offsetof (st, j))' ?, т.е. указатель основанный на смещении члена в его 'struct'? Интересно, для чего это было бы полезно. – Olaf

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