当前位置:网站首页>C | connaissance des pointeurs (II)

C | connaissance des pointeurs (II)

2021-10-14 06:45:41 Ersansui

Préface

La dernière fois qu'on a appris les pointeurs,Alors aujourd'hui, allons plus loin et apprenons le pointeur!

Je n'ai pas lu l'article précédent sur les pointeurs est que les petits partenaires peuvent cliquer sur le lien ci - dessous pour sauter Oh~

Connaissance des pointeurs(Un.)

Insérer la description de l'image ici

Pointeur sans type

Je ne sais pas si les copains ont interrogé la fonction,Voir la liste des paramètres formels de la fonction ou retourner au type,C'est parti.void* Ce genre de?

Par exemple:

void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const void*));

C'est en haut, en bas. void*, Qu'est - ce que c'est? ?

Ce n'est pas un pointeur vide !

Le pointeur nul est représenté par :NULL

Ce type est appelé pointeur sans type !

Pointeur sans type signifie qu'il n'y a pas de pointeur de type spécifique ,C'est - à - dire, Quand vous passez les paramètres d'une fonction , N'importe quel type de pointeur peut être passé .

Ce type de pointeur ne peut pas être non référencé et calculé directement , Un pointeur qui force un type à un type spécifique est nécessaire !

int main() {
    

	void* p;// Une variable pointeur non typée est définie p
	int n = 10;
	p = &n;// Variable entière nAdresse assignée àp

	//printf("%d\n", *p);// C'est une mauvaise utilisation. !
	// Nous devons mettre pLe type de force est converti enint* Le type peut être référencé !

	printf("%d\n", *(int*)p);

	return 0;
}

Pointeur de structure

InCDans la langue, En plus des types de données intégrés , Nous pouvons également personnaliser les types de données .

Les structures sont typiques des types personnalisés ! Apprenons le pointeur de la structure. !

La démonstration de code est la suivante::

#include<stdio.h>

// Définit simplement un type de structure 
struct Book {
    

	char name[20];
	double price;

};


int main() {
    


	// Crée une variable avec un type de structure défini book,Et initialiser
	struct Book book = {
     "sanguoyanyi",25.5 };

	// Définit une variable de pointeur pour une structure ,Et mettrebook L'adresse est assignée à la variable de pointeur de structure 
	struct Book* p = &book;

	// Utiliser un pointeur pour trouver une variable structurelle 
	printf("%s\n", (*p).name);
	printf("%.2lf\n", p->price);

	return 0;
}

L'utilisation de base des variables du pointeur de structure est illustrée ci - dessus. , Connaissance des structures , On ne va pas commencer ici. , Plus tard, nous apprendrons à connaître les structures .

Nous montrons également deux utilisations des variables de pointeur de structure

  1. La variable membre est trouvée après la désactivation
  2. Pointer directement vers la variable membre

À propos de l'utilisation des variables de pointeur de structure , Il y a un scénario d'application particulièrement important. ~

C'est - à - dire qu'une fonction de rappel passe dans une variable de structure lorsqu'elle a besoin d'un autre paramètre , Nous utilisons généralement les adresses des variables de structure entrantes. !

Pointeur de variable d'énumération

InCDans la langue, Les types personnalisés ont des énumérations en plus des structures .

Les types d'énumération ont leurs propres pointeurs. .

Voir la démonstration de code ci - dessous :

#include<stdio.h>

// Un type d'énumération est défini 
enum Day//Semaine
{
    
	Mon,
	Tues,
	Wed,
	Thur,
	Fri,
	Sat,
	Sun
};

int main() {
    

	// Une variable Enum a été créée 
	enum Day day = Mon;

	// Création d'un pointeur de type Enum 
	enum Day* p;

	// Copier l'adresse de la variable Enum vers un pointeur de type Enum 
	p = &day;

	printf("%d\n", *p);


	return 0;
}

Le code ci - dessus montre un pointeur pour un type d'énumération , Mais je n'ai pas assez de connaissances. , Je ne pensais pas qu'il y aurait un scénario d'application , Si vous savez comment l'utiliser, vous pouvez me le dire dans la section commentaires. ~

Pointeur de fonction

Ce ne sont pas seulement les variables qui ont leur propre adresse , Même la fonction a une adresse. !

Regardons d'abord la démonstration de code suivante :

#include <stdio.h>
void test()
{
    
printf("hehe\n");
}
int main()
{
    
printf("%p\n", test);
printf("%p\n", &test);
return 0;
}

Insérer la description de l'image ici
Exécuter le code ci - dessus, Nous découvrirons que les deux valeurs imprimées sont les mêmes .

C'est ce que ça veut dire.

La fonction a également une adresse , Et le nom de la fonction représente l'adresse de la fonction elle - même !

Création d'un pointeur de fonction

Comment créer une variable pointeur pour une fonction ?

void test()
{
    
printf("hehe\n");
}


//En baspfun1Etpfun2Qui a la capacité de stockertestL'adresse de la fonction?
void (*pfun1)();
void *pfun2();

Dans le code ci - dessus,pfun1Est la variable pointeur, Parce qu'il suit d'abord *Union, Indique que la variable est une variable pointeur ,Devantvoid Indique que le type de retour de la fonction qu'il pointe est nul ,Derrière.(), Le paramètre qui représente la fonction qu'il pointe est également nul

Regarde les châtaignes en bas.

Insérer la description de l'image ici

Utilisation du pointeur de fonction

Voyons un autre châtaignier. :

#include<stdio.h>

// Une fonction d'addition est simplement définie 
int Add(int x, int y) {
    

	return x + y;
}

int main() {
    

	// Deux variables de pointeur ont été créées 
	int (*pfun1)(int, int);
	int (*pfun2)(int x, int y);

	// Assigner des valeurs à deux variables de pointeur 
	pfun1 = &Add;
	pfun2 = Add;

	// Appeler une fonction avec un pointeur , Et imprimer la valeur de retour 
	printf("%d\n", (*pfun1)(3, 4));
	printf("%d\n", pfun2(6, 7));


	return 0;
}

Et à travers les châtaignes, nous pouvons savoir

  1. Lors de la création d'une variable de pointeur de fonction , Le symbole de la variable de paramètre pour la liste de paramètres suivante peut être omis
  2. Lors de l'attribution d'une valeur à une variable pointeur ,Nom de la fonction et& Les noms de fonctions ont le même effet réel
  3. Le pointeur de fonction peut être non référencé lorsqu'il appelle une fonction , La fonction peut également être appelée directement à partir du nom de la variable pointeur

Fonction de rappel

Avec un pointeur de fonction, Et nous pouvons l'utiliser pour appeler des fonctions .

Une fonction de rappel est une fonction appelée par un pointeur de fonction.

Si vous pointez une fonction(Adresse)Passer comme argument à une autre fonction,Quand ce pointeur est utilisé pour appeler la fonction qu'il pointe,Disons que c'est une fonction de rappel.

La fonction de rappel n'est pas appelée directement par l'implémentateur de la fonction,Mais appelé par l'autre partie au moment où un événement ou une condition particulier se produit,Pour répondre à cet événement ou à cette condition.

Parmi eux,Fonctions de bibliothèqueqsortListe des paramètres pour, C'est la méthode de la fonction de rappel. !

Les petits partenaires intéressés peuvent également étudier la fonction de bibliothèque eux - mêmes ,Si vous avez le temps, Je partagerai aussi un article sur qsort Blog sur l'utilisation des fonctions ~

Pointeur de tableau

La même chose., Le tableau a également sa propre adresse , Pointeur pour l'adresse du tableau , C'est un pointeur de tableau. ~

Création d'un pointeur de tableau

Insérer la description de l'image ici

Utilisation de pointeurs de tableau


int main(){
    

	// Un tableau entier est défini 
	int arr[10] = {
     0 };

	// Un pointeur qui définit un tableau entier 
	int(*p)[10];

	// Assigner une valeur au pointeur d'un tableau entier 
	p = &arr;


	return 0;
}

Tableau de pointeurs

Voici les châtaignes:

int *arr[10];
//Chaque élément du tableau estint*

Il faut enregistrer l'adresse de la fonction dans un tableau,Ce tableau s'appelle un tableau de pointeurs de fonction,Comment définir un tableau de pointeurs de fonction?

int (*parr1[10])();
int *parr2[10]();
int (*)() parr3[10];

À votre avis, lequel est le bon pour créer un tableau de pointeurs? ?
La réponse est::parr1
parr1 D'abord. [] Union,Descriptionparr1Est un tableau,Quel est le contenu du tableau?
- Oui. int (*)() Pointeur de fonction de type.

Conclusion

C'est la fin de la journée. !

Parce que le contenu d'aujourd'hui est très difficile , Et mon niveau est limité , Il y a des erreurs. , S'il y a une erreur , Et demandez à vos amis de faire des commentaires. ~

Apprenons ensemble.,Allons - y ensemble.!

La création n'est pas facile,J'espère que les gars bougeront les mains.,Fais - moi attention.、Un Oui et un commentaire.~

Insérer la description de l'image ici

版权声明
本文为[Ersansui]所创,转载请带上原文链接,感谢
https://chowdera.com/2021/10/20211013211538463g.html

随机推荐