Хорошо, вы создали массив целых чисел и заполнили его целыми числами от 0 до 4. Затем вы создали 4-элементный массив указателей на целые числа и инициализировали его так, что его четыре элемента указывают на первые четыре элементаа.Пока все хорошо.
Тогда printf очень странный.printf передается один аргумент, а именно ("% u \ n% u \ n% u", p, p, (* p)).Это выражение запятой, которое означает, что выражения, разделенные запятыми, будут вычислены по очереди, и будет возвращено только последнее.Так как самое первое - это литерал, а не выражение, я ожидаю, что оно вызовет ошибку.Однако без лишних скобок у вас есть:
printf("%u\n%u\n%u\n",p, *p, *(*p));
Это законно.В printf передаются три значения, которые интерпретируются как целые числа без знака (которые на самом деле работают только в некоторых системах, поскольку в действительности вы передаете указатели в первых двух случаях, и они не гарантируют, что они имеют тот же размер, что и целые числа без знака)и напечатано.
Это значения p, * p и ** p.p является массивом, и поэтому значение p является адресом массива.* p - это то, на что указывает p, которые являются значениями массива.* p - первое значение, * (p + 1) - второе значение и т. д. Теперь * p - это значение, сохраненное в p [0], который является адресом [0], поэтому печатается другой адрес.Третий аргумент - это ** p, который является значением, хранящимся в (* p), или a [0], который равен 0