&
в C - обратное значение *
.
. Возьмем в качестве примера объявление char ch;
.Он объявляет ch
как однобайтовую целочисленную переменную.Допустим, эта переменная хранится в 0x80000000
.
Когда вы говорите ch = 65
, вы меняете значение в местоположении 0x80000000
на 65
.
&
дает вам адрес, где хранится переменная.Следовательно, &ch
является указателем 0x80000000
.Таким образом, char *pointerToCh; pointerToCh = &ch
приведет к тому, что pointerToCh
будет 0x80000000
*
относится к значению по адресу указателя.Таким образом, *pointerToCh
совпадает с ch
.*pointerToCh = *pointerToCh + 7
изменит ch
на 72
, поскольку оно совпадает с ch = ch + 7
.Из этого также следует, что *(&ch)
- это то же самое, что и ch
.
Есть небольшая проблема, потому что *
также используется в объявлениях типов, чтобы сказать, что что-то является указателем - как вывидел выше в char *pointerToCh
.*
здесь не то же самое *
, что и в *pointerToCh = *pointerToCh + 7
: первый делает типы указателей;второй разыменовывает указатель.
Почему мы это делаем?Поскольку функции в C просто копируют передаваемые им параметры, поэтому они не могут изменять свои параметры и распространять это изменение на вызывающий код.Например:
void uselesslyChange(char copyOfCh) {
// copyOfCh is 65
copyOfCh = 80;
// copyOfCh is 80
}
char ch = 65;
uselesslyChange(ch);
// ch is still 65
Однако, если мы знаем адрес, мы можем изменить его содержимое (даже если адрес просто копия).
void change(char* copyOfChPointer) {
// copyOfChPointer is 0x80000000, and there's a 65 there
*copyOfChPointer = 80;
// copyOfChPointer is 0x80000000, and there's a 80 there
}
char ch = 65;
change(&ch);
// ch is now 80
Итак, ваш код.Важным битом является понимание того, что getline
должен иметь возможность изменять как буфер (указатель на первый символ выделенной области памяти), так и размер буфера (целое число) для отражения размера читаемой строки (например,если буфер слишком мал, getline
переместит его в другое место).Для того чтобы иметь возможность их изменять, необходимо знать их расположение в памяти, как и выше.Таким образом, getline
принимает указатель на указатель на символ (char **buffer
) и указатель на размер (size_t *bufsize
).Помните, **
и *
- это тип , не разыменование.