Maison > développement back-end > C++ > Un casse-tête de pointeur C/C++ ?

Un casse-tête de pointeur C/C++ ?

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Libérer: 2023-09-21 23:33:03
avant
1311 Les gens l'ont consulté

Un casse-tête de pointeur C/C++ ?

Supposons que nous ayons une variable entière dont la taille est de 4 octets et une autre variable pointeur dont la taille est de 8 octets. Alors, quel sera le résultat ci-dessous ?

Exemple

#include<iostream>
using namespace std;
main() {
   int a[4][5][6];
   int x = 0;
   int* a1 = &x;
   int** a2 = &a1;
   int*** a3 = &a2;
   cout << sizeof(a) << " " << sizeof(a1) << " " << sizeof(a2) << " " << sizeof(a3) << endl;
   cout << (char*)(&a1 + 1) - (char*)&a1 << " ";
   cout << (char*)(&a2 + 1) - (char*)&a2 << " ";
   cout << (char*)(&a3 + 1) - (char*)&a3 << " ";
   cout << (char*)(&a + 1) - (char*)&a << endl;
   cout << (char*)(a1 + 1) - (char*)a1 << " ";
   cout << (char*)(a2 + 1) - (char*)a2 << " ";
   cout << (char*)(a3 + 1) - (char*)a3 << " ";
   cout << (char*)(a + 1) - (char*)a << endl;
   cout << (char*)(&a[0][0][0] + 1) - (char*)&a[0][0][0] << " ";
   cout << (char*)(&a[0][0] + 1) - (char*)&a[0][0] << " ";
   cout << (char*)(&a[0] + 1) - (char*)&a[0] << " ";
   cout << (char*)(&a + 1) - (char*)&a << endl;
   cout << (a[0][0][0] + 1) - a[0][0][0] << " ";
   cout << (char*)(a[0][0] + 1) - (char*)a[0][0] << " ";
   cout << (char*)(a[0] + 1) - (char*)a[0] << " ";
   cout << (char*)(a + 1) - (char*)a;
}
Copier après la connexion

Pour résoudre ce problème, nous pouvons suivre quelques points importants :

  • La taille entière est de 4 octets (32 bits) et la taille du pointeur est de 8 octets. Si nous ajoutons 1 au pointeur, il pointera vers le type immédiat suivant.

  • Le type de &a1 est int **, &a2 est int *** et le type de &a3 est int ****. Voici tous les indicateurs. Si nous ajoutons 1, nous ajouterons 8 octets.

  • a [0] [0] [0] est un entier, &a [0] [0] [0] est un entier *, a [0] [0] est un entier *, &a [0] [0] Le type de est int(*)[6] et ainsi de suite. Le type de &a est donc int(*)[4][5][6].

sortie

480 8 8 8
8 8 8 480
4 8 8 120
4 24 120 480
1 4 24 120
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal