Aqui eu tenho um ponteiro ptr
para matriz arr
de 4 números inteiros. ptr
aponta para toda a matriz. ptr[0]
ou *ptr
aponta 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 ptr
como um ponteiro para uma matriz completa de quatro int
valores. 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]
.