Я буду добавлять к превосходным ответам, данным выше, и говорить об упаковке и распаковывании, и как это относится к 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 это помогает!
Отсюда правильный ответ на ваш первый вопрос. Проверьте man-страницу в будущем, она содержит необходимую информацию.
Ваша вторая строка не работает, потому что указатель не инициализирован. Если вы хотите сделать это, вам нужно написать:
char **my_string = malloc(sizeof(char**))
По сути, когда вы создаете переменную, * означает указатель, когда вы ссылаетесь на переменная, это означает разыменование указателя (получить то, на что указывает указатель). & Амп; означает «Указатель, который указывает на это».
Зачем использовать 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
Вы можете думать о *
как об противоположности &
, и что они отменяют друг с другом. [Тысяча сто тридцать одна]