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;
? Isso faria apontar para o início (primeiro elemento) da matriz, que é equivalente a&arr[0]
.int *ptr = arr;
? Na verdade não.int (*ptr)[4]
criaptr
como um ponteiro para uma matriz completa de quatroint
valores. Sintaxe de ponteiro assim é necessária para alocar dinamicamente matrizes multidimensionais verdadeiras. As "matrizes bidimensionais" criadas commalloc()
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/…Respostas:
Digite confusão.
ptr[0]
é uma matriz.ptr
é um ponteiro para a matriz 4 de int .ptr[0]
, como*ptr
adia o ponteiro para uma matriz .sizeof(ptr[0])
é o tamanho de uma matriz.With
sizeof(ptr[0])
,ptr[0]
não incorre em "uma expressão com o tipo '' ponteiro para o tipo '' que aponta para o elemento inicial da conversão do objeto da matriz". (c11dr §6.3.2.1 3). Withsizeof
,ptr[0]
é uma matriz.fonte
&ptr[0][0]
tem oint *
tipoptr[0]
(implicitamente convertido emint *
) avaliaria o endereço do primeiro elemento int.printf("someforamt", ptr[0] , ptr[0]+1)
faz algo diferente desizeof(ptr[0])
. Optr[0]
primeiro caso passa por uma conversão implícita. Comsizeof(ptr[0])
,ptr[0]
não.ptr
aqui é do tipopointer to an array of 4 int elements
e o tipo de matriz tem tamanho 16 na sua plataforma (sizeof (int) * (número de elemetns)).porque o sistema do tipo C possui tipos de matriz. Aqui ambos
arr
e*ptr
tem. O que você declara ter. Para obter sizeof int aqui, você deve sizeof (ptr [0] [0]) - onde ptr [0] é avaliado como array.fonte
com
int (*ptr)[4] = &arr ;
você tem um ponteiro para uma matriz de quatro números inteiros e apontando para arr.ptr
agora está apontando paraarr
, como um ponteiro duplo. Podemos acessar elementos dearr
usarptr[0][x]
, ondex
poderia ser0
para4
.Então
sizeof(ptr[0])
é o mesmo quesizeof(arr)
fonte
Por definição,
ptr[0]
é o mesmo*(ptr + 0)
que, por sua vez, é o mesmo que*ptr
. Além disso,ptr
é inicializado com&arr
, assim*ptr
é*&arr
e isso é justoarr
. Note-se que o armazenamento intermédio de&arr
emptr
que não executa qualquer deterioração matriz, de modo que a equivalência é mantida e nenhuma informação tipo é perdida.Observe que tudo isso é calculado em tempo de compilação, apenas para evitar essa armadilha adicional.
fonte