Почему первый аргумент getline является указателем на указатель «char **» вместо «char *»?

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

Как упомянутые ответы, int просто число (названный , распаковал тип), тогда как Integer объект (который содержит число, следовательно упаковал тип). В терминах Java, который означает (кроме неспособности назвать методы на int), Вы не можете сохранить int или другие нетипы объектов в наборах (List, Map, и т.д.). Для хранения их необходимо сначала втиснуть их в его соответствующем помещенном в коробку типе.

Java 5 вперед имеет что-то позвонившее автоупаковка и автораспаковывание , которые позволяют упаковке/распаковыванию быть сделанной негласно. Сравните и контрастируйте: версия Java 5:

Deque<Integer> queue;

void add(int n) {
    queue.add(n);
}

int remove() {
    return queue.remove();
}

Java 1.4 или ранее (никакие дженерики любой):

Deque queue;

void add(int n) {
    queue.add(Integer.valueOf(n));
}

int remove() {
    return ((Integer) queue.remove()).intValue();
}

нужно отметить, что несмотря на краткость в версии Java 5, обе версии генерируют идентичный байт-код. Таким образом, хотя автоупаковка и автораспаковывание очень удобны, потому что Вы пишете меньше кода, эти операции делают , происходят негласно, с теми же затратами во время выполнения, таким образом, все еще необходимо знать об их существовании.

Hope это помогает!

27
задан vaxquis 19 April 2016 в 18:12
поделиться

2 ответа

Отсюда правильный ответ на ваш первый вопрос. Проверьте man-страницу в будущем, она содержит необходимую информацию.

Ваша вторая строка не работает, потому что указатель не инициализирован. Если вы хотите сделать это, вам нужно написать:

char **my_string = malloc(sizeof(char**))

По сути, когда вы создаете переменную, * означает указатель, когда вы ссылаетесь на переменная, это означает разыменование указателя (получить то, на что указывает указатель). & Амп; означает «Указатель, который указывает на это».

6
ответ дан 28 November 2019 в 05:10
поделиться

Зачем использовать char ** lineptr вместо char * lineptr в качестве параметра функции getline?

char **lineptr используется потому, что getline() запрашивает адрес указателя, который указывает где будет храниться строка.
Вы бы использовали char *lineptr, если бы getline() ожидал сам указатель (который не будет работать, посмотрите, почему в ответе ThisSuitIsBlackNot)

Почему это неправильно, когда я использую следующий код:
char **my_string; bytes_read = getline(my_string, &nbytes, stdin);

Следующее будет работать:

char *my_string;
char **pointer_to_my_string = &my_string;
bytes_read = getline(my_string, &nbytes, stdin);

Я запутался с * и & amp;

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

& получает адрес в памяти переменной (какие указатели были созданы для хранения значения)

char letter = 'c';
char *ptr_to_letter = &letter;
char letter2 = *ptr_to_letter;
char *ptr2 = &*ptr_to_letter; //ptr2 will also point to letter

&*ptr_to_letter означает, что дайте мне адрес (& ) переменной, на которую указывает ptr_to_letter (*), и такая же, как запись ptr_to_letter
Вы можете думать о * как об противоположности &, и что они отменяют друг с другом. [Тысяча сто тридцать одна]

1
ответ дан 28 November 2019 в 05:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: