Une petite question sur les pointeurs (C++)

Bonjour,
J’ai besoin d’une precision sur la manière dont fonctionnent les pointeurs.
On peut ecrire


int *pTab;
pTab = Tab;

Ainsi le pointeur pointe directement que le premier element du tableau. Mais est-ce que je peut le declarer directement comme ca a l’initialisation ?


int *pTab = tab;

Merci de votre aide. :slight_smile:

Oui tu peux l’initialiser directement, il faut juste s’assurer de la validité de ta “tab” (non null)

Je déclare uniquement un tableau Tab[10] que je remplis plus tard au gré de certaines méthodes. Par contre est-ce qu’il est correcte de mettre dans chacune de ces methodes le même argument i (dans la mesure ou il est local a la methode).
C’est a dire que je declare un saisie(int i) puis un afficher(int i), puis un bobmarley(int i) etcetc ou est ce que ca peut etre source de conflit !?

Merci a vous :wink:

non. Par contre vaut mieux nommer intelligemment les paramètres de tes méthodes.

Ben disons que j’essaie de donner des noms adequates a mes variables mais à la declarations des methodes j’ecris juste ce qu’elle doit faire avec des noms cohérent au sein de la méthode. C’est à dire que je fais comme ca …


int saisie(int i) {
  // remplissage
}

int afficher(int i) {
  // remplissage
}

int main () {
// remplissage
saisie(valeur);
afficher(valeur2);
// remplissage
}

Qu’en pense tu ?
Merci

tu devrais séparer ton fichier d’exécution (main) avec celle de tes méthodes et les importer à l’aide de fichier entete .h
tu peux utiliser plusieur la variable i car il s’agit d’une déclaration de variable locale, par contre fait bien attention à déclarer (voir initialiser) toutes tes variables en début de prog

tu saisie quoi? tu affiche quoi? Ce ‘quoi’ sera le nom de tes variables.

je dirai plutot que le quoi sont des entrées sorties de tes méthodes …

Bon ben voiulà mon code dans son intégralité :slight_smile:


#include <cstdlib>
#include <iostream>

using namespace std;

int Tab[10];
int val,rang,n;
int *pTab = Tab;
char q,r;

void init() {
     for (n=0; n<10; n++) {
        *(pTab+n) = n;
        } 
     }

void afficher() {
     for (n=0; n<10; n++) {
        cout << "tab[" << n << "] = " << *(pTab+n) << endl;
        }
     }

int saisie(int i,int i2) {     
     *(pTab+i) = i2;
     return *(pTab+i);         
     }

int main()
{
    while (q != 'q') {
    cout << "Voulez vous (re)initialiser le tableau :";
    cin >> r;
    
    if (r == 'o') {
          init();
          afficher();
          }
          system("PAUSE");
    
    cout << "A quel rang i = ";
    cin >> rang;
    cout << "Saisissez une valeur :";
    cin >> val;
    saisie(rang,val);
    afficher();  
    cout << "q = ";
    cin >> q;    
    }
}

C’est un code de test c’est a dire que je test pas si les caractere saisie sont bien des entiers ou des char etcetc …

Merci a vous :slight_smile:

Bonjour,
si je peux me permettre quelques remarques sur le code:

  • tu as de variables globales, tu peux facilement t’en passer en passant en paramètre de tes fonction les variables dont tu as besoin: ça rend le code à la fois plus souple et plus stable :
  • il te suffit de passer tab en paramètre dans afficher et saisie et "n" en paramètre à afficher
  • q r val et rang ne sont utilisé que dans le main, remonte les à ce niveau
  • qTab be sert à rien, Tab contient la même valeur (un tableau est déjà un pointeur sur int)
  • plutôt que d’incrémenter le pointeur, il est plus clair d’utiliser les []:
    tab[i] au lieu de (tab+i) = i2
  • les nommage de tes variables ne sont pas standards( pas grave, mais comme ça ne coûte rien, autant s’y conformer): donc les variables doivent commencer par une minuscule, les Types par une Majuscule, et les CONSTANTES toutes en majuscules.
  • ton code est correct mais écrit en procédural (donc type C), il vaut peut-être mieux l’écrire en objet dans une classe comme tu fait du C++ (m’enfin ça, c’est ma vision en tant que programmeur Java peut-être que le C++ est correct en mélangeant procédure et objets…) ça te permettrait au moins d’avoir des variables d’instances utilisables entre les méthodes (beaucoup mieux que des variables globales), mais ceci dit, la puissance de l’objet va plus loin…
    voilà.
    deltree

edit: pour le débat sur le bon nommage des variables, il faut se mettre dans la peau d’un développeur qui utiliserait ta fonction comme une API (comme tu utilise les fonctions du C printf) . Il faut que le nom de la fonction et de ses variables suffise à savoir ce que fait la fonction pour savoir quoi mettre comme paramètre:
affiche(int* tableau, int taille): tu saist que tu affiche un tableau, et que l’int passé ensuite correspontd à sa taille
saisie(int* tab, int position, int valeur) : tu sait que position est un entier qui correspond à la position et “valeur” l’entier que tu affect à cette position, si tu appelle ces vairable i et i2, tu ne sait plus à quoi ça correspond à moins de relire le code…ceci dit, là c’est le nom de la méthode qui n’est pas clair :wink:

deltree> non. Chez nous on voit le java avant le c++ pour la simple et bonne raison que l’on risque de faire ce mix. Donc à éviter :slight_smile:

Sans-Nom> d’accord, ça confirme ce que je pense alors, il faut faire du “pur” objet :wink:

+1 pour deltree
tes variables sont mises comme globales de ton prog, tes méthodes sont pas réutilisables …

En fait pour ne rien vous cacher je viens de perdre mon emploi et comme ca fait 3 ans que je taff dans l’electronique je me remet a l’informatique (programmation) que je ne fais plus depuis autant de temps :confused:

Merci à vous pour vos commentaires, ils me sont bien utils :slight_smile:
Concernant le pointeur j’etais bien conscient de son inutilité mais c’etait pour utiliser des pointeurs, revoir les fondamentaux en quelques sortes :wink:

Il ya deux choses que je ne suis pas sur de comprendre dans vos commentaires.
Tout d’abord cette histoire de programme procedural ou alors passer en “pur” objet (il aurait fallu creer une classe tableau dans laquelle on aurait mis toutes ces methodes c’est ca ?)
Et aussi, le coup des variables globales, en gros vous me conseillez de ne jamais mettre de variable globale mais de les mettre au besoin dans les methodes au fur et a mesure que je les utilise c’est ca ? :wink:

En tout cas merci a vous :wink:

pour la réutilisabilité du code il est préférable d’utiliser des classes bien définies avec des fonctions méthodes procédures ayant un nom clair et des paramètres tout aussi clair. ca permet par la suite de pouvoir reprendre une classe ou un ensemble de classe sans avoir a tout recoder.

les variables globales sont déconseillées sauf si on en a besoin (of course)
il vaut mieux passer les paramètres aux fonctions en fonction de leur utilité et de leur degré de visibilté dans la classe et par rapport a l’exterieur.

par exemple, tu n’a pas besoin de déclarer toutes tes variable en globale, q et r peuvent rester a l’interieur du main.

pour mieux comprendre tous ces principes, tu peux chercher des exemples de code sur le net (tout et n’importe quoi), comme sur javasource ou trouver des tutoriaux pour le langage c++.

si tu veux faire du langage objet essaye plutot java => plus simple que le C++
comme l’a dit jmgchouchou tu trouves facilement des tutoriaux.

Java ou … .NET qui est lui aussi tres demandé en entreprise.

il dit vrai, mais pour étudier les fondamentaux de la programmation objet

Java est très bien. En plus avec éclipse, c’est très tès pratique …

pour le .Net, utilise C# avec Visual Express C# (fourni par MS gratuitement c’est du Visual Studio mais seulement pour coder en C#, très suffisant pour apprendre)

ou Ruby, si tu veux te changer les idées (faut que j’essaye)

pourquoi pas du perl tant que tu y es