1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| #include <stdio.h>
int main(void){
int a[] = {12,23,34,45,56,67,78,89,90,100};
int *p, (*q)[2];
p=a;
q = (int (*)[2])&a;
printf("a = %p \t&p = %p \t&q = %p\n",a,&p,&q);
printf("%d\n", *p+2); //14
printf("%d\n", *(p+2)); //34
printf("%p\n", &p+1); // adresse de p + taille d'un pointeur (4 octets)
printf("%p\n",&a[4]); // adresse du 5e element (a +16 octets)
printf("%p\n",&a[4]-3); // adresse du 2e element (a + 4 octets)
printf("%p\n",a+3); // adresse du <s>3e</s> 4e elements (a + 12 octets)
printf("%d\n",&a[7]-p); // a + 7 - a = 7
printf("%p\n",p+(*p-10)); //p+12-10 = p+2 = a+2
printf("%d\n",*(p+*(p+8)-a[7])); //23
puts("\nLe coquinou de 'q'...");
/* q est un pointeur sur un tableau de 2 ints
Voir http://www.developpez.net/forums/d1177939/c-cpp/c/tableaux-string/#post6467166 */
printf("q vaut %p qui est bien l'adresse du debut du tableau 'a'\n" , q);
printf("1=%d 2=%d\n",(*q)[0], (*q)[1] ); //
printf("%d\n",(*q)[3]); // logique avec la ligne du dessus
printf("sizeof(*q) = %d\n", sizeof(*q));
printf("%p\n",q+2); // q decale de 2 fois ce qu'il pointe.
// il pointe un tableau de 2 ints donc 4*2 octets
// on se decale 2 fois donc 16 octets au total
printf("%d\n",(*(q+3))[1]); // en combinant les precedentes explications
// on obtient bien le 8e element de a, soit a[7]
printf("Pour verifier, a[7] = %d\n\n", a[7]);
return 0;
} |
Partager