143-Résumé des fonctions personnalisées (langage C)

Insérez la description de l'image ici
Selon différents systèmes d'exploitation, un processus peut être alloué à différentes zones de mémoire à exécuter, mais quel que soit le type de système d'exploitation, le type d'architecture informatique, la mémoire utilisée par le processus peut être grossièrement divisée en quatre parties selon sa fonction:
(1) Zone de code : Cette zone stocke le code machine binaire qui est chargé et exécuté. Le processeur (CPU) prendra l'adresse et l'exécutera dans cette zone.
(2) Zone de données : utilisée pour stocker des variables globales, variables globales statiques et variables locales statiques, constantes de chaîne, etc.
(3) Zone de tas : le processus peut demander dynamiquement une certaine taille de mémoire dans la zone de tas et la renvoyer dans la zone de tas après son épuisement. Allocation dynamique et le recyclage sont les caractéristiques de la zone de tas
(4) Zone de pile : lorsque la fonction est appelée, la zone de pile est allouée pour stocker les valeurs des paramètres de la fonction, les variables locales, etc., et la relation entre les fonctions est également stocké dynamiquement pour garantir que la fonction appelée retourne à la fonction appelée pour continuer l'exécution lorsqu'elle retourne

Portée (visibilité) et durée de vie (variables locales et variables globales)

Portée : La plage d'identificateurs ne peut être utilisée
que dans la portée d'un identificateur à, visibilité (appelée visibilité )
des variables et des fonctions pour le processus de compilation et de liaison, la
survie est pour le programme en cours d'exécution (processus). Lorsque le programme n'est pas compilé et lié avec succès, n'analysez pas la durée de vie des variables et des fonctions.
Insérez la description de l'image ici
Lorsque le nom de variable défini dans le domaine de fonction a le même nom que le nom de variable défini dans le bloc
, le principe du compilateur est le local principe de priorité

#include<stdio.h>
int main()
{
    
    
	int a=10;
	int b=20;
	if(10==a)
	{
    
    
		int b=100;
		printf("%d\n",b);
	}
	printf("%d\n",b);
	return 0;
}

Insérez la description de l'image ici
Les résultats de sortie sont les suivants.
Insérez la description de l'image ici
Dans le cas de l'imbrication d'autres blocs dans le bloc, s'il y a des variables locales avec le même nom dans le bloc imbriqué, le principe de priorité locale est suivi, c'est-à-dire la variable avec le même nom dans le bloc le bloc externe est blindé dans le bloc interne.
En d'autres termes, dans le bloc interne La portée de la variable locale est le bloc interne et la portée de la variable locale dans le bloc externe est le bloc externe, à l'exception du bloc interne contenant la variable avec le même nom

L'étendue du fichier est également appelée étendue globale
Insérez la description de l'image ici

#include<stdio.h>
int g_max=10;
int main()
{
    
    
	int a=10;
	int g_max=200;
	printf("%d\n",g_max);//局部优先
	printf("%d\n",::g_max);//访问全局变量g_max
	return 0;
}

Insérez la description de l'image ici

Si la variable locale définie dans le bloc a le même nom que la variable globale, la variable locale dans le bloc a toujours la priorité, mais contrairement à la portée du bloc, l'opérateur de domaine :: accès à la variable globale du même nom peut être utilisé dans le bloc

Opérateur de domaine: s'applique uniquement aux variables globales

La visibilité explique la validité des identifiants sous un autre angle. La visibilité et la portée ont une certaine cohérence. La portée de l'identificateur inclut la plage visible et la plage visible ne dépasse pas la portée.
La visibilité est très intuitive lors de la compréhension de l'imbrication de la portée des identificateurs avec le même nom. Si le bloc externe et le bloc interne définissent l'identifiant du même nom, dans la portée externe, l'identifiant interne est invisible, c'est-à-dire que la couche externe fait référence à l'identifiant externe; de ​​même, la couche interne Dans le portée, l'identifiant de la couche externe sera protégé par l'identifiant du même nom dans la couche interne et deviendra invisible, c'est-à-dire que la plage visible de l'identifiant du même nom dans la couche externe est la plage du bloc interne dans la portée.

Durée de vie

Le type de stockage détermine la durée de vie de la variable. La durée de vie de la variable fait référence à la période allant de l'acquisition d'espace à la libération de l'espace (processus d'exécution du programme)
. Il existe 4 spécificateurs de type de stockage: auto, register, static, extern, les deux premiers de type automatique, les deux derniers sont respectivement de type statique et externe.
Insérez la description de l'image ici
Représentation graphique de la durée de vie des variables locales. Les
Insérez la description de l'image ici
identifiants définis dans le bloc interne d'une fonction ont une durée de vie locale et leur durée de vie commence à la déclaration de l'identifiant de la fonction ou block., qui se termine à la fin de la fonction ou du bloc. Les identifiants à durée de vie partielle sont stockés dans la zone de pile. Si l'identifiant à durée de vie partielle n'est pas initialisé, son contenu est aléatoire et inutilisable. Un identifiant avec une durée de vie locale doit avoir une portée locale, mais pas l'inverse.

Diagramme de la durée de vie des variables globales La
Insérez la description de l'image ici
durée de vie statique fait référence à l'identifiant qui existe depuis le début du programme, c'est-à-dire qu'il dispose d'un espace de stockage, et meurt lorsque le programme se termine, c'est-à-dire que l'espace de stockage est libéré.
Les identificateurs à durée de vie statique sont stockés dans la zone de données statiques et appartiennent à des types de stockage statiques, tels que les variables globales, les variables globales statiques et les variables locales statiques.
Un identifiant avec une durée de vie statique n'est pas initialisé par l'utilisateur, le système l'initialise automatiquement à 0. La
fonction réside dans la zone de code et a également une durée de vie statique. Tous les identificateurs avec une portée de fichier ont une durée de vie statique

Diagramme des variables modifiées par le mot-clé static
Insérez la description de l'image ici
La portée des variables statiques locales est le domaine du bloc, mais la durée de vie est le fichier entier.
Autrement dit, lorsque le bloc se termine, l'espace variable statique local est toujours conservé, et l'espace variable statique local n'est pas libéré jusqu'à la fin du fichier programme entier et la durée de vie se termine

Deux utilisations courantes de la statique
1. Comptez le nombre de fois qu'une fonction est appelée
2. Réduisez la surcharge liée à la création et à l'affectation de tableaux locaux. La création et l'affectation de variables nécessitent une certaine surcharge du processeur, en particulier pour les types de stockage contenant de nombreux éléments , tels que les tableaux. Dans certaines fonctions qui contiennent plus de variables et sont fréquemment appelées, certains tableaux peuvent être déclarés en tant que type statique pour réduire la surcharge liée à la soustraction ou à l'initialisation de ces variables (objectif principal).
Insérez la description de l'image ici
Ecrire le résultat imprimé

#include<stdio.h>
#define ARSIZE 10

int *Get_Array()
{
    
    
	int ar[ARSIZE]={
    
    1,2,3,4,5,6,7,8,9,10};
	return ar;
}

int main()
{
    
    
	int *p=Get_Array();
	for(int i=0;i<ARSIZE;++i)
	{
    
    
		printf("%d\n",p[i]);
	}
	return 0;
}

Insérez la description de l'image ici
Comment résoudre?
Insérez la description de l'image ici
Insérez la description de l'image ici
Insérez la description de l'image ici
Défini comme une méthode régulière et ne peut pas être modifié
Insérez la description de l'image ici

mot-clé extern

Seules les variables globales et les fonctions peuvent être modifiées, les variables locales et les variables locales statiques ne peuvent pas être modifiées.
Les types de stockage externe incluent des variables externes et des fonctions externes. Dans
un programme composé de plusieurs fichiers programme source, si un fichier doit être défini dans un autre fichier Variables globales ou fonctions, ces fichiers source communiquent via des variables et des fonctions externes
. Les variables globales et les fonctions définies dans un fichier sont toutes externes par défaut, c'est-à-dire que leur portée peut être étendue à d'autres fichiers du programme. Mais si d'autres fichiers veulent utiliser les variables globales et les fonctions définies dans ce fichier, extern doit être utilisé comme une déclaration externe avant utilisation, qui est généralement placée au début du fichier.
Lorsque la variable est définie, le compilateur lui alloue de l'espace de stockage et la déclaration de variable indique que la variable globale a été expliquée ailleurs. Le système de compilation n'alloue plus d'espace de stockage et utilise directement l'espace alloué lorsque la variable est définie.
Les déclarations de fonction sont externes par défaut, donc le modificateur extern est généralement omis
Insérez la description de l'image ici
Insérez la description de l'image ici

Exemple de compilation de fichiers multiples

Insérez la description de l'image ici
Insérez la description de l'image ici

Je suppose que tu aimes

Origine blog.csdn.net/LINZEYU666/article/details/112916035
conseillé
Classement