Initialisation sans effort d'un tableau de pointeurs en C :conseils et bonnes pratiques
Un pointeur est une variable qui stocke l'adresse d'une autre variable. Le nom de la variable pointeur doit être préfixé par le symbole "*". Tout comme dans le cas d'une variable normale, nous pouvons également déclarer un "tableau de pointeurs", où chaque indice du tableau contient l'adresse d'un type de tableau.
Comment initialiser un tableau de pointeurs en C ?
Une variable pointeur peut être initialisée au moment de la déclaration, en lui attribuant l'adresse d'une variable existante. L'extrait suivant montre comment initialiser un pointeur -
int x = 10; int *y = &x;
Par défaut, toutes les variables, y compris les variables de pointeur, appartiennent à la « classe de stockage automatique ». Cela signifie qu'une variable de pointeur stockera une adresse mémoire aléatoire imprévisible, inutile, ce qui peut conduire à un comportement indéfini et à des risques potentiels pour un programme, tels que des erreurs de segmentation. Par conséquent, il doit être initialisé à NULL si nous n'avons pas de valeur spécifique à stocker au moment de la déclaration.
int *ptr = NULL;
Un "tableau de pointeurs" stocke l'adresse dans chaque élément. Le type du tableau doit correspondre au type de la variable cible.
Initialiser un tableau de pointeurs à l'aide d'un mot-clé statique
Vous pouvez également utiliser le mot clé static pour initialiser un tableau de pointeurs pour stocker "0" dans chaque indice.
Exemple
#include <stdio.h>
int main(){
static int *ptr[5];
for (int i = 0; i < 5; i++){
printf("ptr[%d] = %d\n", i, ptr[i]);
}
return 0;
}
Sortie
Exécutez le code et vérifiez sa sortie −
ptr[0]= 0 ptr[1]= 0 ptr[2]= 0 ptr[3]= 0 ptr[4]= 0
Initialiser le tableau de pointeurs entiers
Ici, nous déclarons un tableau de pointeurs entiers et stockons les adresses de trois variables entières.
Exemple
#include <stdio.h>
int main(){
int a = 10, b = 20, c = 30;
int *ptr[3] = {&a, &b, &c};
for (int i = 0; i < 3; i++){
printf("ptr[%d]: address: %d value: %d\n", i, ptr[i], *ptr[i]);
}
return 0;
}
Sortie
Exécutez le code et vérifiez sa sortie −
ptr[0]: address: 6422040 value: 10 ptr[1]: address: 6422036 value: 20 ptr[2]: address: 6422032 value: 30
Initialiser le tableau de pointeurs par adresses directes
Nous pouvons stocker l'adresse de chaque élément d'un tableau normal dans l'élément correspondant d'un tableau de pointeurs.
Exemple
#include <stdio.h>
int main(){
int arr[] = {10, 20, 30};
int *ptr[3] = {&arr[0], &arr[1], &arr[2]};
for (int i = 0; i < 3; i++){
printf("ptr[%d]: address: %d value: %d\n", i, ptr[i], *ptr[i]);
}
return 0;
}
Sortie
Exécutez le code et vérifiez sa sortie −
ptr[0]: address: 6422032 value: 10 ptr[1]: address: 6422036 value: 20 ptr[2]: address: 6422040 value: 30
Parcours d'un tableau avec son adresse de base
Lorsque l'on obtient l'adresse de base d'un tableau (dans ce cas "&arr[0]"), on peut obtenir les adresses de ses éléments suivants, sachant que le pointeur s'incrémente de la taille du type de données.
Ainsi, juste avec l'adresse de base (le nom du tableau est le même que l'adresse du 0ème élément), nous pouvons parcourir un tableau.
Exemple 1
Jetez un oeil à l'exemple suivant -
#include <stdio.h>
int main(){
int arr[] = {10, 20, 30};
int *ptr=arr;
for (int i = 0; i < 3; i++){
printf("ptr[%d]: address: %d value: %d\n", i,ptr+i, *(ptr+i));
}
return 0;
}
Sortie
Exécutez le code et vérifiez sa sortie −
ptr[0]: address: 6422020 value: 10 ptr[1]: address: 6422024 value: 20 ptr[2]: address: 6422028 value: 30
Exemple 2 : Parcours d'un tableau 2D à l'aide d'un tableau de pointeurs
Dans cet exemple, nous avons un tableau 2D. L'adresse du 0ème élément de chaque ligne est stockée dans un tableau de pointeurs. Lors du parcours, l'adresse stockée dans chaque élément du tableau de pointeurs, qui pointe vers le 0ème élément de la ligne correspondante, chacune incrémentée pour récupérer les valeurs de chaque ligne.
#include <stdio.h>
int main(){
// 2d array
int arr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
};
int ROWS = 2, COLS = 4;
int i, j;
// pointer
int (*ptr)[4] = arr;
// print the element of the array via pointer ptr
for (i = 0; i < ROWS; i++) {
for (j = 0; j < COLS; j++) {
printf("%d ", *(ptr[i]+j));
}
printf("\n");
}
return 0;
}
Sortie
Lorsque vous exécutez ce code, il produira le résultat suivant -
1 2 3 4 5 6 7 8
Exemple 3
Nous n'avons pas vraiment besoin d'un tableau de pointeurs ici, car nous pouvons utiliser le nom de ce tableau 2D comme pointeur de base et l'incrémenter par ligne et par colonne pour récupérer les éléments du tableau 2D donné -
#include <stdio.h>
int main(){
// 2d array
int arr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
};
int ROWS = 2, COLS = 4;
int i, j;
// pointer
int *ptr = arr;
// print the element of the array via pointer ptr
for (i = 0; i < ROWS; i++){
for (j = 0; j < COLS; j++){
printf("%d ", *(ptr + i * COLS + j));
}
printf("\n");
}
return 0;
}
Sortie
Le résultat ressemble à celui du code précédent −
1 2 3 4 5 6 7 8
Initialiser le tableau de pointeurs de caractères (chaîne)
En programmation C, une chaîne est un tableau de type de données char. Puisque le nom d'un tableau représente également l'adresse de son 0ème élément, une chaîne peut être déclarée comme −
char arr[] = "Hello";
En utilisant la notation de pointeur, une chaîne est affectée à un pointeur de caractère comme −
char *arr = "Hello";
Nous pouvons ensuite déclarer un tableau de pointeurs char pour stocker plusieurs chaînes comme suit -
char *arr[3] = {"string1", "string2", "string3", . . . };
Exemple
L'exemple suivant contient un tableau de pointeurs char utilisé pour stocker les noms de langages informatiques -
#include <stdio.h>
int main(){
char *langs [10] = {
"PYTHON", "JAVASCRIPT", "PHP",
"NODE JS", "HTML", "KOTLIN", "C++",
"REACT JS", "RUST", "VBSCRIPT"
};
for(int i = 0; i < 10; i++)
printf("%s\n", langs[i]);
return 0;
}
Sortie
Lorsque vous exécutez ce code, il produira le résultat suivant -
PYTHON JAVASCRIPT PHP NODE JS HTML KOTLIN C++ REACT JS RUST VBSCRIPT
Dans ce programme, "langs" est un pointeur vers un tableau de 10 chaînes. Par conséquent, si "langs[0]" pointe vers l'adresse 5000, alors "langs + 1" pointera vers l'adresse 5004 qui stocke le pointeur vers la deuxième chaîne.
Par conséquent, nous pouvons également utiliser la variante suivante de la boucle pour imprimer le tableau de chaînes −
for (int i = 0; i < 10; i++){
printf("%s\n", *(langs + i));
}
Initialisation du tableau dynamique de pointeurs
Vous pouvez utiliser la fonction malloc() pour déclarer et initialiser un tableau de pointeurs de manière dynamique.
Exemple
Jetez un oeil à l'exemple suivant -
#include <stdio.h>
int main(){
int *arr = (int *)malloc (sizeof (int) * 5);
for(int i = 0; i < 5; i++){
arr[i] = i;
}
for (int x = 0; x < 5; x++){
printf("%d %d\n", x, arr[x]);
}
return 0;
}
Sortie
Lorsque vous exécutez ce code, il produira le résultat suivant -
0 0 1 1 2 2 3 3 4 4
Vous pouvez même demander une saisie à l'utilisateur et attribuer les valeurs aux éléments dans le pointeur des tableaux −
for(i = 0; i < 5; i++){
scanf("%d", &x);
arr[i] = x;
}
Langue C
- Classe imbriquée C#
- Passer des tableaux à une fonction en C
- Syndicats C
- Boucle do…while C++ avec exemples
- Carte dans la bibliothèque de modèles standard C++ (STL) avec exemple d'impression
- C - Fichiers d'en-tête
- C# - Structures
- C# - Variables
- Tutoriel C# Stream :StreamReader, StreamWriter avec exemple