Mais &tab
est équivalent à tab,
à &tab[0]
et à tab+0.
Mais &tab
est équivalent à tab,
à &tab[0]
et à tab+0.
Mais &tab
est équivalent à tab,
à &tab[0]
et à tab+0.
dans le code ci-dessous, je ne vois pas pourquoi
je suis obligé de déréférencer 2 fois &tab pour
avoir la valeur pointée (lignes 'ICI') étant donné
que tab et &tab ont les mêmes valeurs.
Mon raisonnement est le suivant, corrigez-moi si j'ai faux :
- tab est un tableau de 3 entiers, le type de tab est donc int[3],
- &tab est l'adresse du tableau de 3 entiers, c'est donc un pointeur
constant(?) vers un tableau de 3 entiers, le type de &tab est donc
int (*p)[3].
Mais &tab est équivalent à tab, à &tab[0] et à tab+0. Après je ne sais
plus...
Merci de bien vouloir me donner des explications simples et "décortiquées".
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int tab[3] = {1,2,3};
/* les formes de l'adresse du tableau */
printf("Valeur de tab : %pn", tab);
printf("Valeur de &tab[0] : %pn", &tab[0]);
printf("Valeur de tab + 0 : %pn", tab + 0);
printf("Valeur de &tab : %pn", &tab);
printf("Valeur pointee : %dn", **&tab); /* ICI */
dans le code ci-dessous, je ne vois pas pourquoi
je suis obligé de déréférencer 2 fois &tab pour
avoir la valeur pointée (lignes 'ICI') étant donné
que tab et &tab ont les mêmes valeurs.
Mon raisonnement est le suivant, corrigez-moi si j'ai faux :
- tab est un tableau de 3 entiers, le type de tab est donc int[3],
- &tab est l'adresse du tableau de 3 entiers, c'est donc un pointeur
constant(?) vers un tableau de 3 entiers, le type de &tab est donc
int (*p)[3].
Mais &tab est équivalent à tab, à &tab[0] et à tab+0. Après je ne sais
plus...
Merci de bien vouloir me donner des explications simples et "décortiquées".
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int tab[3] = {1,2,3};
/* les formes de l'adresse du tableau */
printf("Valeur de tab : %pn", tab);
printf("Valeur de &tab[0] : %pn", &tab[0]);
printf("Valeur de tab + 0 : %pn", tab + 0);
printf("Valeur de &tab : %pn", &tab);
printf("Valeur pointee : %dn", **&tab); /* ICI */
dans le code ci-dessous, je ne vois pas pourquoi
je suis obligé de déréférencer 2 fois &tab pour
avoir la valeur pointée (lignes 'ICI') étant donné
que tab et &tab ont les mêmes valeurs.
Mon raisonnement est le suivant, corrigez-moi si j'ai faux :
- tab est un tableau de 3 entiers, le type de tab est donc int[3],
- &tab est l'adresse du tableau de 3 entiers, c'est donc un pointeur
constant(?) vers un tableau de 3 entiers, le type de &tab est donc
int (*p)[3].
Mais &tab est équivalent à tab, à &tab[0] et à tab+0. Après je ne sais
plus...
Merci de bien vouloir me donner des explications simples et "décortiquées".
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int tab[3] = {1,2,3};
/* les formes de l'adresse du tableau */
printf("Valeur de tab : %pn", tab);
printf("Valeur de &tab[0] : %pn", &tab[0]);
printf("Valeur de tab + 0 : %pn", tab + 0);
printf("Valeur de &tab : %pn", &tab);
printf("Valeur pointee : %dn", **&tab); /* ICI */
bonsoir,
dans le code ci-dessous, je ne vois pas pourquoi
je suis obligé de déréférencer 2 fois &tab pour
avoir la valeur pointée (lignes 'ICI') étant donné
que tab et &tab ont les mêmes valeurs.
Mon raisonnement est le suivant, corrigez-moi si j'ai faux :
- tab est un tableau de 3 entiers, le type de tab est donc int[3],
- &tab est l'adresse du tableau de 3 entiers, c'est donc un pointeur
constant(?) vers un tableau de 3 entiers, le type de &tab est donc
int (*p)[3].
Mais &tab est équivalent à tab, à &tab[0] et à tab+0. Après je ne sais
plus...
Merci de bien vouloir me donner des explications simples et "décortiquées".
Lip
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int tab[3] = {1,2,3};
/* les formes de l'adresse du tableau */
printf("Valeur de tab : %pn", tab);
printf("Valeur de &tab[0] : %pn", &tab[0]);
printf("Valeur de tab + 0 : %pn", tab + 0);
printf("Valeur de &tab : %pn", &tab);
printf("Valeur pointee : %dn", **&tab); /* ICI */
printf("n");
/* les formes des valeurs du dernier élément du tableau */
printf("Forme 1 : %dn", tab[2]);
printf("Forme 2 : %dn", *tab + 2);
printf("Forme 3 : %dn", **&tab + 2); /* ICI */
printf("n");
printf("Adresse du dernier element de tab : %pn", &tab[2]);
return EXIT_SUCCESS;
}
bonsoir,
dans le code ci-dessous, je ne vois pas pourquoi
je suis obligé de déréférencer 2 fois &tab pour
avoir la valeur pointée (lignes 'ICI') étant donné
que tab et &tab ont les mêmes valeurs.
Mon raisonnement est le suivant, corrigez-moi si j'ai faux :
- tab est un tableau de 3 entiers, le type de tab est donc int[3],
- &tab est l'adresse du tableau de 3 entiers, c'est donc un pointeur
constant(?) vers un tableau de 3 entiers, le type de &tab est donc
int (*p)[3].
Mais &tab est équivalent à tab, à &tab[0] et à tab+0. Après je ne sais
plus...
Merci de bien vouloir me donner des explications simples et "décortiquées".
Lip
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int tab[3] = {1,2,3};
/* les formes de l'adresse du tableau */
printf("Valeur de tab : %pn", tab);
printf("Valeur de &tab[0] : %pn", &tab[0]);
printf("Valeur de tab + 0 : %pn", tab + 0);
printf("Valeur de &tab : %pn", &tab);
printf("Valeur pointee : %dn", **&tab); /* ICI */
printf("n");
/* les formes des valeurs du dernier élément du tableau */
printf("Forme 1 : %dn", tab[2]);
printf("Forme 2 : %dn", *tab + 2);
printf("Forme 3 : %dn", **&tab + 2); /* ICI */
printf("n");
printf("Adresse du dernier element de tab : %pn", &tab[2]);
return EXIT_SUCCESS;
}
bonsoir,
dans le code ci-dessous, je ne vois pas pourquoi
je suis obligé de déréférencer 2 fois &tab pour
avoir la valeur pointée (lignes 'ICI') étant donné
que tab et &tab ont les mêmes valeurs.
Mon raisonnement est le suivant, corrigez-moi si j'ai faux :
- tab est un tableau de 3 entiers, le type de tab est donc int[3],
- &tab est l'adresse du tableau de 3 entiers, c'est donc un pointeur
constant(?) vers un tableau de 3 entiers, le type de &tab est donc
int (*p)[3].
Mais &tab est équivalent à tab, à &tab[0] et à tab+0. Après je ne sais
plus...
Merci de bien vouloir me donner des explications simples et "décortiquées".
Lip
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int tab[3] = {1,2,3};
/* les formes de l'adresse du tableau */
printf("Valeur de tab : %pn", tab);
printf("Valeur de &tab[0] : %pn", &tab[0]);
printf("Valeur de tab + 0 : %pn", tab + 0);
printf("Valeur de &tab : %pn", &tab);
printf("Valeur pointee : %dn", **&tab); /* ICI */
printf("n");
/* les formes des valeurs du dernier élément du tableau */
printf("Forme 1 : %dn", tab[2]);
printf("Forme 2 : %dn", *tab + 2);
printf("Forme 3 : %dn", **&tab + 2); /* ICI */
printf("n");
printf("Adresse du dernier element de tab : %pn", &tab[2]);
return EXIT_SUCCESS;
}
dans le code ci-dessous, je ne vois pas pourquoi
je suis obligé de déréférencer 2 fois &tab pour
avoir la valeur pointée (lignes 'ICI') étant donné
que tab et &tab ont les mêmes valeurs.
Mon raisonnement est le suivant, corrigez-moi si j'ai faux :
- tab est un tableau de 3 entiers, le type de tab est donc int[3],
- &tab est l'adresse du tableau de 3 entiers, c'est donc un pointeur
constant(?) vers un tableau de 3 entiers, le type de &tab est donc
int (*p)[3].
Mais &tab est équivalent à tab, à &tab[0] et à tab+0. Après je ne sais
plus...
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int tab[3] = {1,2,3};
/* les formes de l'adresse du tableau */
printf("Valeur de tab : %pn", tab);
printf("Valeur de &tab[0] : %pn", &tab[0]);
printf("Valeur de tab + 0 : %pn", tab + 0);
printf("Valeur de &tab : %pn", &tab);
printf("Valeur pointee : %dn", **&tab); /* ICI */
/* les formes des valeurs du dernier élément du tableau */
printf("Forme 1 : %dn", tab[2]);
printf("Forme 2 : %dn", *tab + 2);
printf("Forme 3 : %dn", **&tab + 2); /* ICI */
dans le code ci-dessous, je ne vois pas pourquoi
je suis obligé de déréférencer 2 fois &tab pour
avoir la valeur pointée (lignes 'ICI') étant donné
que tab et &tab ont les mêmes valeurs.
Mon raisonnement est le suivant, corrigez-moi si j'ai faux :
- tab est un tableau de 3 entiers, le type de tab est donc int[3],
- &tab est l'adresse du tableau de 3 entiers, c'est donc un pointeur
constant(?) vers un tableau de 3 entiers, le type de &tab est donc
int (*p)[3].
Mais &tab est équivalent à tab, à &tab[0] et à tab+0. Après je ne sais
plus...
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int tab[3] = {1,2,3};
/* les formes de l'adresse du tableau */
printf("Valeur de tab : %pn", tab);
printf("Valeur de &tab[0] : %pn", &tab[0]);
printf("Valeur de tab + 0 : %pn", tab + 0);
printf("Valeur de &tab : %pn", &tab);
printf("Valeur pointee : %dn", **&tab); /* ICI */
/* les formes des valeurs du dernier élément du tableau */
printf("Forme 1 : %dn", tab[2]);
printf("Forme 2 : %dn", *tab + 2);
printf("Forme 3 : %dn", **&tab + 2); /* ICI */
dans le code ci-dessous, je ne vois pas pourquoi
je suis obligé de déréférencer 2 fois &tab pour
avoir la valeur pointée (lignes 'ICI') étant donné
que tab et &tab ont les mêmes valeurs.
Mon raisonnement est le suivant, corrigez-moi si j'ai faux :
- tab est un tableau de 3 entiers, le type de tab est donc int[3],
- &tab est l'adresse du tableau de 3 entiers, c'est donc un pointeur
constant(?) vers un tableau de 3 entiers, le type de &tab est donc
int (*p)[3].
Mais &tab est équivalent à tab, à &tab[0] et à tab+0. Après je ne sais
plus...
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int tab[3] = {1,2,3};
/* les formes de l'adresse du tableau */
printf("Valeur de tab : %pn", tab);
printf("Valeur de &tab[0] : %pn", &tab[0]);
printf("Valeur de tab + 0 : %pn", tab + 0);
printf("Valeur de &tab : %pn", &tab);
printf("Valeur pointee : %dn", **&tab); /* ICI */
/* les formes des valeurs du dernier élément du tableau */
printf("Forme 1 : %dn", tab[2]);
printf("Forme 2 : %dn", *tab + 2);
printf("Forme 3 : %dn", **&tab + 2); /* ICI */
bonsoir,
dans le code ci-dessous, je ne vois pas pourquoi
je suis obligé de déréférencer 2 fois &tab pour
avoir la valeur pointée (lignes 'ICI') étant donné
que tab et &tab ont les mêmes valeurs.
Mon raisonnement est le suivant, corrigez-moi si j'ai faux :
- tab est un tableau de 3 entiers, le type de tab est donc int[3],
- &tab est l'adresse du tableau de 3 entiers, c'est donc un pointeur
constant(?) vers un tableau de 3 entiers,
le type de &tab est donc
int (*p)[3].
Ok.
Mais &tab est équivalent à tab,
à &tab[0] et à tab+0.
Après je ne sais
plus...
Merci de bien vouloir me donner des explications simples et "décortiquées".
Lip
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int tab[3] = {1,2,3};
/* les formes de l'adresse du tableau */
printf("Valeur de tab : %pn", tab);
printf("Valeur de &tab[0] : %pn", &tab[0]);
tab est de type int[3]
printf("Valeur de tab + 0 : %pn", tab + 0);
printf("Valeur de &tab : %pn", &tab);
tab est de type int[3],
printf("Valeur pointee : %dn", **&tab); /* ICI */
On a &tab de type int(*)[3]
printf("n");
/* les formes des valeurs du dernier élément du tableau */
printf("Forme 1 : %dn", tab[2]);
Ok.
printf("Forme 2 : %dn", *tab + 2);
Non, *(tab+2)
printf("Forme 3 : %dn", **&tab + 2); /* ICI */
Non. *(*&tab +2). Meme probleme d'associativite. Meme jeux de
printf("n");
printf("Adresse du dernier element de tab : %pn", &tab[2]);
bonsoir,
dans le code ci-dessous, je ne vois pas pourquoi
je suis obligé de déréférencer 2 fois &tab pour
avoir la valeur pointée (lignes 'ICI') étant donné
que tab et &tab ont les mêmes valeurs.
Mon raisonnement est le suivant, corrigez-moi si j'ai faux :
- tab est un tableau de 3 entiers, le type de tab est donc int[3],
- &tab est l'adresse du tableau de 3 entiers, c'est donc un pointeur
constant(?) vers un tableau de 3 entiers,
le type de &tab est donc
int (*p)[3].
Ok.
Mais &tab est équivalent à tab,
à &tab[0] et à tab+0.
Après je ne sais
plus...
Merci de bien vouloir me donner des explications simples et "décortiquées".
Lip
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int tab[3] = {1,2,3};
/* les formes de l'adresse du tableau */
printf("Valeur de tab : %pn", tab);
printf("Valeur de &tab[0] : %pn", &tab[0]);
tab est de type int[3]
printf("Valeur de tab + 0 : %pn", tab + 0);
printf("Valeur de &tab : %pn", &tab);
tab est de type int[3],
printf("Valeur pointee : %dn", **&tab); /* ICI */
On a &tab de type int(*)[3]
printf("n");
/* les formes des valeurs du dernier élément du tableau */
printf("Forme 1 : %dn", tab[2]);
Ok.
printf("Forme 2 : %dn", *tab + 2);
Non, *(tab+2)
printf("Forme 3 : %dn", **&tab + 2); /* ICI */
Non. *(*&tab +2). Meme probleme d'associativite. Meme jeux de
printf("n");
printf("Adresse du dernier element de tab : %pn", &tab[2]);
bonsoir,
dans le code ci-dessous, je ne vois pas pourquoi
je suis obligé de déréférencer 2 fois &tab pour
avoir la valeur pointée (lignes 'ICI') étant donné
que tab et &tab ont les mêmes valeurs.
Mon raisonnement est le suivant, corrigez-moi si j'ai faux :
- tab est un tableau de 3 entiers, le type de tab est donc int[3],
- &tab est l'adresse du tableau de 3 entiers, c'est donc un pointeur
constant(?) vers un tableau de 3 entiers,
le type de &tab est donc
int (*p)[3].
Ok.
Mais &tab est équivalent à tab,
à &tab[0] et à tab+0.
Après je ne sais
plus...
Merci de bien vouloir me donner des explications simples et "décortiquées".
Lip
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int tab[3] = {1,2,3};
/* les formes de l'adresse du tableau */
printf("Valeur de tab : %pn", tab);
printf("Valeur de &tab[0] : %pn", &tab[0]);
tab est de type int[3]
printf("Valeur de tab + 0 : %pn", tab + 0);
printf("Valeur de &tab : %pn", &tab);
tab est de type int[3],
printf("Valeur pointee : %dn", **&tab); /* ICI */
On a &tab de type int(*)[3]
printf("n");
/* les formes des valeurs du dernier élément du tableau */
printf("Forme 1 : %dn", tab[2]);
Ok.
printf("Forme 2 : %dn", *tab + 2);
Non, *(tab+2)
printf("Forme 3 : %dn", **&tab + 2); /* ICI */
Non. *(*&tab +2). Meme probleme d'associativite. Meme jeux de
printf("n");
printf("Adresse du dernier element de tab : %pn", &tab[2]);
La question a trouvé réponse, mais que dire de ces quelques lignes :
#include <stdio.h>
int main(void) {
printf("main = %pn", (void*)(main));
printf("&main = %pn", (void*)(&main));
printf("*main = %pn", (void*)(*main));
printf("&*main = %pn", (void*)(&*main));
printf("**main = %pn", (void*)(**main));
printf("***main = %pn", (void*)(***main));
printf("****main = %pn", (void*)(****main));
return 0;
}
La question a trouvé réponse, mais que dire de ces quelques lignes :
#include <stdio.h>
int main(void) {
printf("main = %pn", (void*)(main));
printf("&main = %pn", (void*)(&main));
printf("*main = %pn", (void*)(*main));
printf("&*main = %pn", (void*)(&*main));
printf("**main = %pn", (void*)(**main));
printf("***main = %pn", (void*)(***main));
printf("****main = %pn", (void*)(****main));
return 0;
}
La question a trouvé réponse, mais que dire de ces quelques lignes :
#include <stdio.h>
int main(void) {
printf("main = %pn", (void*)(main));
printf("&main = %pn", (void*)(&main));
printf("*main = %pn", (void*)(*main));
printf("&*main = %pn", (void*)(&*main));
printf("**main = %pn", (void*)(**main));
printf("***main = %pn", (void*)(***main));
printf("****main = %pn", (void*)(****main));
return 0;
}
"Charlie Gordon" writes:La question a trouvé réponse, mais que dire de ces quelques lignes :
#include <stdio.h>
int main(void) {
printf("main = %pn", (void*)(main));
printf("&main = %pn", (void*)(&main));
printf("*main = %pn", (void*)(*main));
printf("&*main = %pn", (void*)(&*main));
printf("**main = %pn", (void*)(**main));
printf("***main = %pn", (void*)(***main));
printf("****main = %pn", (void*)(****main));
return 0;
}
Les pointeurs vers fonctions sont amusants n'est-ce pas?
(Des conversions implicites dans les deux sens)
Justement, la question que je me pose: ne serait-il pas préférable de
"Charlie Gordon" <news@chqrlie.org> writes:
La question a trouvé réponse, mais que dire de ces quelques lignes :
#include <stdio.h>
int main(void) {
printf("main = %pn", (void*)(main));
printf("&main = %pn", (void*)(&main));
printf("*main = %pn", (void*)(*main));
printf("&*main = %pn", (void*)(&*main));
printf("**main = %pn", (void*)(**main));
printf("***main = %pn", (void*)(***main));
printf("****main = %pn", (void*)(****main));
return 0;
}
Les pointeurs vers fonctions sont amusants n'est-ce pas?
(Des conversions implicites dans les deux sens)
Justement, la question que je me pose: ne serait-il pas préférable de
"Charlie Gordon" writes:La question a trouvé réponse, mais que dire de ces quelques lignes :
#include <stdio.h>
int main(void) {
printf("main = %pn", (void*)(main));
printf("&main = %pn", (void*)(&main));
printf("*main = %pn", (void*)(*main));
printf("&*main = %pn", (void*)(&*main));
printf("**main = %pn", (void*)(**main));
printf("***main = %pn", (void*)(***main));
printf("****main = %pn", (void*)(****main));
return 0;
}
Les pointeurs vers fonctions sont amusants n'est-ce pas?
(Des conversions implicites dans les deux sens)
Justement, la question que je me pose: ne serait-il pas préférable de
- C est un langage où tab et &tab d'un coté, [...] peuvent être
indifféremment utilisés dans quantité d'expression.
- C est un langage où tab et &tab d'un coté, [...] peuvent être
indifféremment utilisés dans quantité d'expression.
- C est un langage où tab et &tab d'un coté, [...] peuvent être
indifféremment utilisés dans quantité d'expression.