Aqui eu tenho um ponteiro ptrpara matriz arrde 4 números inteiros. ptraponta para toda a matriz. ptr[0]ou *ptraponta para o primeiro elemento da matriz, portanto, adicionar 1 a ptr[0]fornece o endereço do segundo elemento da matriz.
Não consigo entender por que usar sizeof(ptr[0])fornece o tamanho de toda a matriz, 16 bytes, não o tamanho apenas do primeiro elemento, 4 bytes (como ptr[0]pontos do primeiro elemento na matriz).
int arr[4] = {0, 1, 2, 3};
int (*ptr)[4] = &arr;
printf("%zd", sizeof(ptr[0])); //output is 16
int *ptr = arr;? Na verdade não. int (*ptr)[4]cria ptrcomo um ponteiro para uma matriz completa de quatro intvalores. Sintaxe de ponteiro assim é necessária para alocar dinamicamente matrizes multidimensionais verdadeiras. As "matrizes bidimensionais" criadas com malloc()loops aninhados e descritas incorretamente como matrizes multidimensionais são na verdade matrizes 1-d de ponteiros para várias matrizes 1-d. Veja stackoverflow.com/questions/42094465/…
int *ptr = arr;? Isso faria apontar para o início (primeiro elemento) da matriz, que é equivalente a&arr[0].