Les pointeurs

Soyez le premier à donner votre avis sur cette source.

Snippet vu 8 323 fois - Téléchargée 39 fois

Contenu du snippet

Un petit tut sur les pointeurs ! :)

Source / Exemple :


Une variable un stoké dans la mémoire de votre PC. Chaque emplacement de mémoire et identifié par une adresse.

Un pointer permet de stoker dans une variable l'adresse d'une autre variable.
Les pointers sont très importants en C. Vous verrez par la suite de votre apprentissage l'utilisation.

Comme déclarer un pointer :

Un pointer se déclare comme une variable. Soit que devant il faut rajouter une *
ATTENTION si vous déffinissez un pointer de type float il ne pourra contenir qu'une adresse d'une variable du même type ! 

Exemple de déclaration d'un pointer "p_var" et d'une variable "var" de type "float"
	
	float *p_var, var;

Maintenant il faut initialisé ce pointer en lui donnant l'adresse de la variable :

	p_var = &var;

Nous allons écrire un petit programme qui déclare un pointer est une varaible et affiche celle-ci de deux façon :

	// START //

	#include <stdio.h>

	float *p_var, var;
	var = 121.54;

	p_var = &var;

	// Affichage de la variable
	printf("Première facon : %lf\n", var);
	printf("Deuxième facon : %lf\n", *p_var);
	
	// END // 

On appelle la première façon un accés direct à la mémoire,
et la deuxieme façon un accés         indirect à la mémoire.

Les tableaux :

Les pointers sont très utile pour les tableau ! Car en fait les index des tableau ne sont pas autre chose que des pointer !

Exemple de déclaration et d'initialisation avec les tableaux :
	
	int tableau[100], &p_tableau;
	p_tableau = tableau;
	
Maintenant voici un petit prog. Il affiche les adresse déléments successifs d'un tableau

// START //

#include <stdio.h>

int i[10], x;
float f[10];
double d[10];

main()
{
	printf("\t\tInteger\t\tFloat\t\tDouble");
	printf("\n================================");
	printf("======================");

	for(x=0; x<10; x++)
	printf("\nElement %d:\t%ld\t\t%ld\t\%ld", x, &i[x], &f[x], &d[x]);

	printf("\n================================");
	printf("======================\n\n");

	return 0;
}

// END //

Passez des pointeurs en paramètres :
------------------------------------

Imaginons une fonction :
	int GetString(char *szStr) { }
	
	Elle doit retourner le nombre de caractères qu'elle aura mis dans szStr.
	
	int GetString(char *szStr) {
		strcpy(szStr, "Bonjour");
		return 7;
	}
	
	Dans un programme on peut faire :
	char *szbuff;
	
	szbuff = (char *)malloc(255);
	if (szbuff != NULL) {
	
		printf("Nombre de caractères : %i\n", GetString(szbuff));
		printf("Chaine mise : %s\n\n", szbuff);
	
		free(szbuff);	
	} else {
		printf("Erreur d'allocation.");
	}

Voilà pour les pointeurs ! 

Amusez-vous bien ! :))

Conclusion :


Amusez-vous bien ! :))

A voir également

Ajouter un commentaire Commentaires
Messages postés
12
Date d'inscription
dimanche 13 novembre 2005
Statut
Membre
Dernière intervention
29 juin 2009

Salut,

Voici code suivant :
int *a, b=11;
a=&b;
Disons que l'adresse de b est 0xabcdefg.
Est-ce possible de creer un pointer qui pointe sur cette adresse.
Le pseudo code serait :
pointer = 0xabcdefg.

Merci
Messages postés
212
Date d'inscription
dimanche 29 juin 2003
Statut
Membre
Dernière intervention
13 mai 2006

//START//

tu pourrais parler de pointeur de structure.

mais aussi pour passer en argument a une fonction une chaine de charactere
ca pourrait etre utile

//END//
Messages postés
101
Date d'inscription
samedi 9 février 2002
Statut
Membre
Dernière intervention
5 mai 2009

demo simple : essaye ca

void echanger(int a, int b){
int temp = b;
b = a;
a = temp;
}

void echanger(int * a, int * b){
int temp = *b;
*b = *a;
*a = temp;
}
Messages postés
113
Date d'inscription
lundi 24 février 2003
Statut
Membre
Dernière intervention
5 janvier 2004

On dira que la critique est facile, mais bon faut corriger les bugs.
Alors un 1: comme déjà dit, faut pas de guillemets pour l'affectation. Mais ce n'est pas tout: Un warning apparaît à la compilation (Avec VC6.0): il faut caster 121.54 comme suit: (long)121.54 ou alors déclarer var et *p_var comme double.
Autre chose bien plus grave: surtout, ne pas afficher &p_var, on affiche l'adresse du pointeur: ce qui n'a aucun sens. Ce qu'on veut c'est afficher le contenu de la variable pointée par p_var => *p_var.
Vanpet: utilité des pointeurs:
NooN a déjà bien répondu, mais n'oublions pas que ces pointeurs ne sont pas indispensables: par exemple Java n'en a pas.
Alors pourquoi en user? L'intérêt est l'accès direct à la mémoire => gain de temps. Par exemple griser une image pour aller jusqu'à 75x plus vite avec des pointeurs que sans.
Mais parcontre, les pointeurs sont très dangereux, on peurt accéder à des zones mémoires non autorisées et par exemple écrire des données sur le segment de code.
Ne jamais oublier que les pointeurs sont comme un bistouri: dans les mains d'un chirurgien, c'est un outils très précieux. Mais dans les mains d'un terrorsite, c'est une arme qui peut tuer.
Messages postés
97
Date d'inscription
mardi 9 avril 2002
Statut
Membre
Dernière intervention
11 mai 2008

c bien fait mais c du niveau 1 ...
Afficher les 10 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.