Рассмотрим следующий пример:
#include<stdio.h>
int main()
{
int myArray[10][10][10][10]; //A 4 Dimentional array;
//THESE WILL ALL PRINT THE SAME VALUE
printf("%d, %d, %d, %d, %d\n",
myArray,
myArray[0],
myArray[0][0],
myArray[0][0][0],
&myArray[0][0][0][0]
);
//NOW SEE WHAT VALUES YOU GET AFTER ADDING 1 TO EACH OF THESE POINTERS
printf("%d, %d, %d, %d, %d\n",
myArray+1,
myArray[0]+1,
myArray[0][0]+1,
myArray[0][0][0]+1,
&myArray[0][0][0][0]+1
);
}
Вы увидите, что все 5 значений, напечатанных в первом случае все равны. Потому что они указывают на то же начальное местоположение.
Но когда вы увеличиваете их на 1, вы видите, что разные указатели теперь прыгают (точки) в разные местоположения. Это связано с тем, что myArray[0][0][0] + 1
будет прыгать на 10 целых значений, что составляет 40 байт, тогда как myArray[0][0] + 1
будет прыгать на 100 целых значений i.e на 400 байт. Аналогично myArray[0] + 1
перескакивает на 1000 целых значений или 4000 байт.
Значения зависят от того, что уровень указателя Вы имеете в виду.
Но теперь, если я использую указатели для обозначения всех из них:
#include<stdio.h>
int main()
{
int myArray[10][10][10][10]; //A 4 Dimentional array;
int * ptr1 = myArray[10][10][10];
int ** ptr2 = myArray[10][10];
int *** ptr3 = myArray[10];
int **** ptr4 = myArray;
//THESE WILL ALL PRINT THE SAME VALUE
printf("%u, %u, %u, %u\n", ptr1, ptr2, ptr3, ptr4);
//THESE ALSO PRINT SAME VALUES!!
printf("%d, %d, %d, %d\n",ptr1+1,ptr2+1,ptr3+1,ptr4+1);
}
Итак, вы видите, разные уровни переменных указателей не ведут себя так, как переменная массива делает.
'auto' не играет хорошо с указателями, обычно это не подлежит проверке с помощью таких типов. – user2485710
@ user2485710 Можете ли вы подробно остановиться на этом? Любые ссылки/цитаты? – Domi
'auto' отлично работает с указателями, нет подсказки, где вы получили эту идею. –