C и C-подобные языки имеют понятие «область действия». Видите все эти фигурные скобки ({
и }
)? Это "блоки". По сути, они заключают весь код между ними в пакеты, которые не зависят от каких-либо других блоков на том же уровне. Любая переменная, которую вы создаете в этом блоке, доступна только внутри этого блока - вы не можете ссылаться на нее где-либо еще.
Вы можете создать вложенный блок. Например:
int f() {
int x;
scanf("%d", &x);
if (x == 3) {
return 7;
}
else {
return x;
}
}
Как видите, блок else
вложен в блок функции, и поэтому может обращаться к переменным функции.
Когда вы объявляете struct x **z
в main
и sample2
, вы фактически создаете две переменные, каждая из которых называется z
. Они полностью независимы - они совсем не одна и та же переменная. Они не связаны. Единственное, что у них общего, это их имя и тип - фактическое значение другое. Единственный способ использовать одну и ту же переменную в обоих случаях - передать, как в sample1
.
Конечно, в данный момент ваш указатель z
является мусором - вы ничего не выделили. Я бы порекомендовал вам что-то там хранить, прежде чем пытаться разыменовать это.