2015-02-08 2 views
0

У меня есть небольшая программа, которая при компиляции кидает мне следующие ошибкиУказатель на структуру массива

ошибка # 2168: операнды «+» имеют несовместимые типы «повестки дня структура» и «INT».

ошибка # 2113: левый операнд '.' имеет несовместимый тип 'int'.

ошибка # 2088: требуется Lvalue.

Это код, который я сделал

#include <stdio.h> 

struct agenda{ 
    int order, cellular; 
    char name[30], last_name[30], street[30], city[30], mail[50]; 
}contact[10]; 

int main(void) 
{ 
    struct agenda *ptrcontact; 
    ptrcontact = &contact[0]; 

    (*ptrcontact+3).order = 3; 

    printf("\n\n %d", (*ptrcontact).order); 
    return 0; 
} 

, потому что он бросает эти ошибки и как их исправить?

+0

Что такое '* ptrcontact'? Его 'контакт [0]'. Вы должны попробовать что-то вроде: '(ptrcontact + 3) -> order = 3;' – DOOM

+0

(* ptrcontact + 3) дает вам любые точки ptrcontact в (повестка дня структуры) и добавляет к ней 3 (int). * имеет более высокий приоритет, чем +, поэтому, чтобы получить третий индекс, вам нужно либо написать: * (ptrcontact + 3), либо ptrcontact [3]. – Beko

ответ

6

Вам нужно изменить

(*ptrcontact+3).order = 3; 

в

ptrcontact[3].order = 3; 

или, по крайней мере,

(*(ptrcontact+3)).order = 3; 

или

(ptrcontact + 3)->order = 3; 

В противном случае, согласно precedence rule, * имеет более высокий приоритет над +, вызывая ошибку.

Просто чтобы добавить к этому, ptrcontact является указателем (до struct agenda) и может использоваться как операнд для оператора +.

OTOH, *ptrcontact имеет тип struct agenda и не может использоваться как операнд для оператора +.

2

Вы разыскиваете указатель, который дает структуру, и, очевидно, вы ничего не можете добавить к этому. Разыменовывают оператор имеет наивысший приоритет, что вам нужно сделать это следующим образом: (*(ptr + 3)).order или использовать стрелку вместо звезды точки: (ptr + 3) -> order

+0

Человек, который действительно взял меня так долго, чтобы набрать –

0

Ваша проблема здесь заключается в операции приоритет:

(*ptrcontact+3).order = 3; 

Это derefers ptrcontract, а затем пытается для добавления номера в разделенную структуру. Это дает вам точную ситуацию, о которой вы сообщаете.

Мои рекомендации:

Либо избежать адреса ariphmetics в таких случаях. Используйте индексы массива.

int baseIndex = 0; 
contact[baseIndex + 3].order = 3; 

Или, если вы действительно должны сделать так, скрыть адресную арифметику снаружи:

(pcontact + 3)->order = 3; 

И, наконец, узнать C language operations priority или сделать это один раз (но некоторые C люди не любят, C++) , C++ operations priority

+0

Это вопрос c, и предоставленная ссылка будет содержать операторы, которые даже не действительны на языке c. 'en.cppreference.com' - это ресурс C++, а не ресурс c. –

+0

Точно. Но все действительные приоритеты операций, как ожидает программист C-программист ;-). Это просто, чтобы не узнать их снова, когда начинается C++. –

+1

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

0

погрешность в строках (* ptrcontact + 3) .order = 3; и printf ("\ n \ n% d", (* ptrcontact) .order) ;. В этой инструкции используйте -> вместо. ошибки будут решены.