в чем разница между двумя утверждениями? - PullRequest
0 голосов
/ 24 октября 2019

Я написал следующий код, есть некоторая разница, но я не могу ее понять.

typedef struct {
    char* ch;   
    int length;
}Hstring;
int Strlength(Hstring* s) {
    return s->length; // if I use s.length there, error occurs.
}
int Strlength(Hstring s) {
    return s.length; // if I use s->length there, error occurs.
}

Так в чем же разница между этими двумя типами? Получу ли я такой же результат? и почему эти ошибки происходят?

Ответы [ 4 ]

3 голосов
/ 24 октября 2019

Чтобы добавить к предыдущим ответам то, что точка (.) предназначена для «нормальных» переменных, а стрелка (->) - для указателей, обратите внимание, что стрелка является синтаксическим эквивалентом разыменования указателя, за которым следуетточка, предоставленная для удобства (поскольку это такая распространенная операция).

Hstring* s;
s->length;   // this is equivalent to...
(*s).length; // ...this

Скобки необходимы, поскольку точка имеет более высокий приоритет, чем звезда. Без них вы бы а) использовали точку с указателем и б) пытались отменить ссылку на поле целой длины, оба из которых были бы недействительными.

Hstring* s;
*s.length;   // this is equivalent to...
*(s.length); // ...this (not what you want at all)
2 голосов
/ 24 октября 2019

Разница заключается в точечных (.) и операторах стрелок (->).

Вы можете использовать только оператор точки (.) со структурой или переменной объединения для доступа к ее членам.

Вы можете использовать только оператор стрелки (->) с переменной указателя для доступа к членам структуры или объединения, на которое указывает указатель.

1 голос
/ 24 октября 2019

Как уже упоминалось, оператор . предназначен для доступа к членам struct , тогда как оператор -> предназначен для доступа к членам указателя структуры .

Однако еще одно важное различие между вашими двумя функциями заключается в том, что в Strlength(Hstring* s) параметр передается по ссылке , подразумевая, что функция работает в «исходной» ячейке памяти структуры данных. и, следовательно, может изменить его содержимое.

Напротив, в Strlength(Hstring s) параметр передается значением , подразумевая, что функция работает с копией исходной структуры и изменения, внесенные в функцию, не будут видны внефункция.

См. Также этот ответ .

0 голосов
/ 24 октября 2019

*s - указатель, вы можете ссылаться на элементы, используя оператор ->, если нет *, это просто переменная, вы можете ссылаться на элементы, используя оператор (точка) .

...