C++ Punteros vs Arreglos

Punteros en C++

Los punteros y los arreglos están estrechamente relacionados. De hecho, los punteros y los arreglos son intercambiables en muchos casos. Por ejemplo, un puntero que apunta al inicio de un arreglo puede acceder al arreglo mediante aritmética de punteros o indexación de arreglos. Vea el siguiente programa:

Ejemplo

#include <iostream> using namespace std; const int MAX = 3; int main () { int var[MAX] = {10, 100, 200}; int *ptr; // Dirección del arreglo en el puntero ptr = var; for (int i = 0; i < MAX; i++) { cout << "var[" << i << "La dirección de memoria de ] es"; cout << ptr << endl; cout << "var[" << i << "El valor de ] es"; cout << *ptr << endl; // Moverse a la siguiente posición ptr++; } return 0; }

Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:

var[0]的内存地址为 0x7fff59707adc
var[0] 的值为 10
var[1]的内存地址为 0x7fff59707ae0
var[1] 的值为 100
var[2]的内存地址为 0x7fff59707ae4
var[2] 的值为 200

Sin embargo, los punteros y los arreglos no son completamente intercambiables. Por ejemplo, vea el siguiente programa:

Ejemplo

#include <iostream> using namespace std; const int MAX = 3; int main () { int var[MAX] = {10, 100, 200}; for (int i = 0; i < MAX; i++) { *var = i; // Esta es la sintaxis correcta var++; // Esto es incorrecto } return 0; }

Aplicar el operador de puntero * a var es perfectamente válido, pero modificar el valor de var es ilegal. Esto se debe a que var es una constante que apunta al inicio del arreglo y no puede usarse como valor l (lvalue).

Dado que un nombre de arreglo corresponde a un puntero constante, siempre que no se cambie el valor del arreglo, todavía se pueden usar expresiones en forma de puntero. Por ejemplo, la siguiente es una declaración válida que asigna 500 a var

*(var + 2) = 500;

La declaración anterior es válida y se compila correctamente porque var no cambia.

Punteros en C++

Otras extensiones