Pointeur déréférencé d’un (char *) à (int *) non compris dans cet exemple

Je passais des tests de pratique sur C sur un site Web, où il m’est arrivé de voir cette question. Mon doute est expliqué dans les commentaires, alors veuillez les lire.

#include int main() { int arr[3] = {2, 3, 4}; // its assumed to be stored in little-endian ie; // 2 = 00000010 00000000 00000000 00000000 // 3 = 00000011 00000000 00000000 00000000 // 4 = 00000100 00000000 00000000 00000000 char *p; p = arr; p = (char*)((int*)(p)); printf("%d ", *p); p = (int*)(p+1); // This casting is expected to convert char pointer p // to an int pointer , thus value at p ,now is assumed // to be equal to 00000000 00000000 00000000 00000011 // but, the output was : 0 . As ,per my assumption it // should be : 2^24+2^25 = 50331648 ,Please Clarify // if my assumption is Wrong and explain Why? printf("%d\n", *p); return 0; } 

Si vous reliez p en int* , la valeur de int serait:

 00000000 00000000 00000000 00000011 

où le dernier octet est le premier octet de votre deuxième élément de tableau. En faisant p+1 , vous sautez l’octet le moins significatif du premier élément.

Rappelez-vous que p rest un pointeur de caractère, donc lui assigner un int* ne changera pas son type.

Lorsque vous printf le caractère à p+1 , vous imprimez la valeur du deuxième octet, qui est 0.

 p = (char*)((int*)(p)); // till now the pointer p is type casted to store the variable of type character. printf("%d, ", *p); // %d means integer value so value at first address ie 2 will be printed. p = (int*)(p+1); // here p is still of type character as type casted in step 1 so p(ie address) and plus 1 will increase only by one byte so 

En supposant que cet entier nécessite 2 octets de stockage, le tableau d’entiers sera stocké en mémoire comme

 value 2 3 4 address 00000010 00000000 00000011 00000000 00000100 00000000 pointer p+1 

donc p+1 pointe vers cet emplacement qui n’a pas été rempli, car lors de l’initialisation, 2,3,4 ont été stockés dans une variable de type entier (2 octets).

donc p+1 pointera vers 00000000 .

(int*)p+1 // p+1 is type casted again to integer

printf("%d", *p); // this will print 0 as output as by default integer contains 0 as value.

Rappelez-vous que p est toujours un pointeur de caractère. Donc, *p va chercher une valeur de caractère. La valeur char est ensuite promue en un int lorsqu’elle est transmise en tant qu’argument à une fonction variadique (comme printf ).