Разница между указателями * , * и * в C

Я изучаю график (список смежности) от гиков к гикам и вижу этот код:

// A structure to represent an adjacency list node
struct AdjListNode
{
    int dest;
    struct AdjListNode* next;
};

// A structure to represent an adjacency liat
struct AdjList
{
    struct AdjListNode *head;  // pointer to head node of list
};

// A structure to represent a graph. A graph is an array of adjacency lists.
// Size of array will be V (number of vertices in graph)
struct Graph
{
    int V;
    struct AdjList* array;
};

Я хотел бы знать разницу между:

struct AdjListNode* next; и struct AdjListNode *head; и struct AdjListNode * head;


person Pat R Ellery    schedule 22.05.2015    source источник
comment
Ничего, кроме стиля. синтаксически они все одинаковы.   -  person hoss    schedule 22.05.2015
comment
Пробелы здесь неуместны. Возможно, вы захотите взглянуть на cdecl.org.   -  person shuttle87    schedule 22.05.2015
comment
* всегда связан с декларатором, а не со спецификатором типа; T *a и T* a оба анализируются как T (*a). Пробелы в данном случае не имеют значения.   -  person John Bode    schedule 22.05.2015


Ответы (4)


Как уже говорили другие, это одно и то же, однако взгляните на следующий пример:

int main() {
    int* a = NULL , b;
    b = 5;
    a = &b;
    printf("a = %p, *a = %d, b = %d", a,  *a, b);
    return 0;
}

вывод: a = 000000000022FE44, *a = 5, b = 5 в первой строке int* a = 0 , b; только a имеет тип int* (он же указатель), другими словами, * относится только к первой переменной, это означает, что b имеет тип int

person ThunderWiring    schedule 22.05.2015

Они одинаковые, только разные стили написания "указатель на структуру AdjListNode".

person Jeff Ames    schedule 22.05.2015

Ответ на этот вопрос: они одинаковы. Несмотря на то, что они все одинаковы, довольно интересно, почему они на самом деле одинаковы.

это потому, что в соответствии со стандартом C 6.4.6 Пунктуаторы символ "*" является пунктуатором. Поэтому он не может быть частью имени типа.

Как вы можете прочитать в 6.4.6.2, знак препинания — это символ, который имеет независимое синтаксическое и семантическое значение.

Вот почему он обрабатывается иначе, чем обычный символ, который составляет имя типа, поэтому он интерпретируется как указатель. Поскольку это не может быть частью имени, компилятор всегда предполагает, что вы закончили имя типа, как только он увидит «*», в случае, когда первым стоит пробел, пробелы просто игнорируются.

Раздел 5.1.1.2 — Этапы перевода стандарта описывает, как компилятор обрабатывает пробелы. (а по факту, что после токенизации они уже не важны).

Я подумал, может стоит добавить.

person cerkiewny    schedule 22.05.2015

На самом деле это просто стиль, такой же, как при написании a+b против a + b против a+ b.

Однако я хотел бы отметить, что в C принято писать звездочку рядом с именем переменной, например:

int *p;

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

int* pointer, not_a_pointer, *another_pointer;

Напротив, в C++ звездочка обычно ставится рядом с типом, так как это информация о типе, а не о переменной: int* p

Обобщить:

  • В C переменная обычно читается как указатель на тип int.
  • В C++ переменная обычно читается как тип «указатель на целое число».

Надеюсь, это имеет смысл.

person mtijanic    schedule 22.05.2015