... как мы можем получить к ним доступ, используя G-> var ...
Кажется, вы не совсем ясно понимаете, что такое указатель.Указатель - это простая переменная, которую вы можете читать и записывать как любую другую.Но вы можете сделать еще одну операцию с указателем: разыменовать его (используя * или ->).Чтобы выполнить эту конкретную операцию, значение указателя должно быть допустимым: указатель содержит адрес, и, если этот адрес недействителен, возникает ошибка.Думайте на указатель как конверт, написано или нет.Вы можете прочитать, что написано на конверте;Вы также можете стереть и написать на нем.Но когда вы читаете адрес, написанный на конверте, вы хотите, чтобы этот адрес существовал, в противном случае вы можете искать адрес, который не существует, и злиться.
Можно считать, что конкретное значение указателя похожек целому числу.Вы можете взять любое целое число и выполнить вычисления с ним, но, если вы хотите делить для него, ваше целое число должно отличаться от 0, иначе произойдет ошибка.Так же как и указатель: вы можете прочитать его и записать его с любым значением, но, если вы хотите использовать его значение как то, что обычно должно быть, то есть адрес в памяти, это значение должно указывать на подходящий адрес,malloc () и calloc () возвращают значения, которые действительны и подходят для назначения указателю и могут безопасно использоваться (при нормальных условиях) при попытке разыменования указателя.
РЕДАКТИРОВАТЬ после комментариев ниже.Обычно думают, что если программе не гарантируется правильное поведение, это ошибка.Чтобы программа всегда работала правильно, необходимо принять много мер предосторожности.Два из них: 1) Не используйте неизвестные значения и 2) Не разыменовывайте недействительные указатели.Ошибки могут быть точно разделены по номенклатуре, стилю или эффекту, который они производят или могут производить.Неопределенное поведение - это имя, данное в спецификации языка Си, чтобы указать, что компилятор (или целевой компьютер) может делать все, что хочет, потому что спецификация не требует ничего точного.Конечно, никто не хочет «неопределенного поведения», поэтому сделать это просто ошибка.Возвращаясь к разыменованию неверных указателей, спецификация говорит, что она вызывает неопределенное поведение.Точно, в зависимости от целевой машины и ОС, может произойти одно или несколько из следующего: 1) ничего, кроме чтения неизвестных значений;2) ничего, кроме записи в неизвестные зоны памяти;3) ошибки сегмента или другие ловушки / исключения и т. Д .;4) Перегрев процессора, возможно, взрыв или другие неуказанные вещи.
Теперь мы делаем шаг вперед.Если ваша переменная-указатель не является «нормальной», глобальной переменной, а вместо этого находится в динамической - не выделенной - памяти, ваша переменная еще не существует.Это концепция, а не реальная переменная.Итак, сначала вы создаете эту переменную;затем вы можете использовать его, как сказано выше.
В вашем примере, "Struct Graph" - это объявление группы переменных, которые не существуют, пока вы не выделите их.Как только вы это сделаете, через «Graph * G = malloc (sizeof (* G));» они оживают;но это не значит, что они имеют действительные значения.Фактически, чуть ниже создания структуры, в вашем фрагменте кода они доступны.Единственный законный доступ к ним, в данный момент, состоит в том, чтобы назначить им некоторую ценность.Как уже было сказано, их также можно прочитать - они на самом деле существуют, но их ценность может (ну, в общем, ИС) незаконна.
Если бы значения в только что созданном структурном графе были простыми целыми числами, а не указателями, дело было бы одинаковым: переменные существуют, но их содержимое неизвестно и, следовательно, недопустимо.Обратите внимание, что вы могли бы выделить Struct Graph с помощью calloc (): в этом случае значение переменных внутри не было бы неизвестно, но для указателя все равно было бы недопустимым для разыменования - как целое число, которое известно равным нулю и, следовательно, недопустимымбыть использован в качестве делителя.Но переменные есть, готовые к тестированию против 0 (в случае целого числа) или против NULL (или 0) в случае указателей, или готовы к записи со значимыми значениями.
Надеюсь, ядостаточно ясно, чтобы помочь.