Toutes les données de l'ordinateur doivent être placées en mémoire. Le nombre d'octets occupés par différents types de données est différent. Par exemple, int prend 4 octets et char prend 1 octet. Afin d'accéder correctement à ces données, chaque octet doit être numéroté, tout comme le numéro de la maison et le numéro d'identification, chaque numéro d'octet est unique, et un certain octet peut être trouvé avec précision en fonction du numéro.
La figure 4G est la mémoire pour chaque numéro d'octet (en hexadécimal):
Nous avons appelé le nombre d'octets d'adresse mémoire (adresse) ou pointeur (pointeur). L'adresse augmente dans l'ordre à partir de 0. Pour un environnement 32 bits, le programme peut utiliser 4 Go de mémoire, la plus petite adresse est 0 et la plus grande adresse est 0XFFFFFFFF.
Le code suivant montre comment sortir une adresse:
- #include <stdio.h>
- int main(){
- int a = 100 ;
- char str [ 20 ] = "c.biancheng.net" ;
- printf ( "% # X,% # X \ n " , & a , str );
- retourner 0 ;
- }
Résultat de l'opération:
0X28FF3C, 0X28FF10 %#X
signifie la sortie sous forme hexadécimale, avec préfixe 0X
. a est une variable, utilisée pour stocker des entiers, vous devez ajouter en avant &
pour obtenir son adresse; str lui-même représente la première adresse de la chaîne, vous n'avez pas besoin d'ajouter &
.
langage C a un caractère de contrôle%p
, dédié à l' approvisionnement adresse sous forme hexadécimale, mais le format de sortie% p n'est pas uniforme, avec un compilateur0x
préfixe, certains sans, donc ici nous n'avons pas utilisé.
Tout est une adresse
Le langage C utilise des variables pour stocker les données et des fonctions pour définir un morceau de code qui peut être réutilisé. Ils doivent finalement être placés en mémoire pour être utilisés par le CPU.
Les données et le code sont stockés en mémoire sous forme binaire, et l'ordinateur ne peut pas distinguer dans le format si un morceau de mémoire stocke des données ou du code. Lorsque le programme est chargé en mémoire, le système d'exploitation attribue différentes autorisations à différents blocs de mémoire. Les blocs de mémoire avec des autorisations de lecture et d'exécution sont le code, tandis que les autorisations de lecture et d'écriture (peuvent uniquement avoir des autorisations de lecture) Le bloc de mémoire est les données.
La CPU ne peut obtenir le code et les données en mémoire que par l'adresse.Lors de l'exécution du programme, la CPU sera informée du code à exécuter et de l'adresse des données à lire et à écrire. Si le programme fait accidentellement une erreur, ou si le développeur le fait intentionnellement, lorsque le CPU veut écrire des données, donnez-lui une adresse dans la zone de code, et une erreur d'accès à la mémoire se produira. Ce type d'erreur d'accès à la mémoire sera intercepté par le matériel et le système d'exploitation, forçant le programme à planter, et le programmeur n'a aucune chance de salut.
Lorsque le CPU accède à la mémoire, il a besoin d'adresses, pas de noms de variables et de noms de fonctions! Les noms de variable et les noms de fonction ne sont qu'une sorte d'adresse mnémonique. Lorsque le fichier source est compilé et lié dans un programme exécutable, ils seront remplacés par des adresses. Une tâche importante du processus de compilation et de liaison est de trouver les adresses correspondant à ces noms.
En supposant que les adresses des variables a, b et c en mémoire soient respectivement 0X1000, 0X2000 et 0X3000, l'opération d'addition c = a + b;
sera convertie sous une forme similaire à la suivante:
0X3000 = (0X1000) + (0X2000);
( )
Représente l'opération de valeur. L'expression entière signifie prendre les valeurs aux adresses 0X1000 et 0X2000, les ajouter et affecter le résultat de l'ajout au
nom de la variable de mémoire et au nom de la fonction à l' adresse 0X3000. Nous vous offrons la commodité, laissez-nous Lors de la rédaction du code, vous pouvez utiliser des chaînes anglaises faciles à lire et à comprendre, sans avoir à faire face directement à l'adresse binaire.
Il convient de noter que bien que les noms de variable, les noms de fonction, les noms de chaîne et les noms de tableau soient essentiellement les mêmes, ils sont tous des mnémoniques d'adresses, mais dans le processus d'écriture de code, nous pensons que les noms de variable représentent les données elles-mêmes , Et le nom de la fonction, le nom de la chaîne et le nom du tableau représentent la première adresse du bloc de code ou du bloc de données.