Есть ли разница между int * и Type *? - PullRequest
3 голосов
/ 22 сентября 2010

Я реализую очередь в C. У меня есть такая структура:

struct Node {
    Node* next;
    Node* previous;
    // data
}

Поскольку next и previous являются просто указателями, имеет ли значение, если я использую Node* или int*? например:

struct Node {
    int* next;
    int* previous;
    // data
}

Ответы [ 6 ]

8 голосов
/ 22 сентября 2010

Мало того, что он вносит ясность в ваш код (что важно, чем больше ваш проект), математика указателя работает правильно, только если вы выполняете математику с правильным типом.В вашем случае добавление 1 к Node * приведет к добавлению sizeof (Node) к базовому указателю, который почти гарантированно не будет == sizeof (int).

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

5 голосов
/ 22 сентября 2010

Использование int * неверно и приводит к неопределенному поведению. Вы можете использовать либо Node *, либо void *, но если вы используете любой тип, отличный от Node *, то потребуется преобразование (или неявное преобразование, например, посредством присваивания) обратно в Node *, прежде чем вы сможете разыменовать его .

4 голосов
/ 22 сентября 2010

Да, это так. Node не является int (Node будет больше, чем int), поэтому указатель на int или указатель на Node будут иметь значение.

2 голосов
/ 22 сентября 2010

Все правы во всем.

Ключевым моментом является то, что даже если вы знаете, что внутреннее представление указателя является адресом, независимо от типа данных, C не делает такого предположения.

Включение явного типа позволяет компилятору лучше выполнять проверку кода.

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

Кстати, строгое изучение CI (еще в юрский период) не позволило бы вам первый пример (C ++ делает и некоторые современные компиляторы C).Вместо этого вы должны были бы сказать

struct Node {
    struct Node* next;
    struct Node* previous;
    // data };
0 голосов
/ 22 сентября 2010

Если есть

Node * pNode;

, можно ожидать, что вы сможете писать выражения вроде следующего без приведения

(*pNode).next = ...
pNode->next = ...
0 голосов
/ 22 сентября 2010

Когда вы используете int *, вы имеете в виду, что вы указываете на целое число, а когда вы используете Node *, это означает, что вы указываете на узел.указатель.Когда его int *, pointer ++ будет смещать указатель на sizeof (int), а когда его Node *, pointer ++ будет смещать указатель на sizeof (Node).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...