Bienvenido a nuestra comunidad, en este lugar vas a encontrar la respuesta de lo que estabas buscando.
Solución:
por un poco de hechos aquí está el texto relevante de las especificaciones
Operador de igualdad (==,!=)
Los punteros a objetos del mismo tipo se pueden comparar por igualdad con los resultados esperados ‘intuitivos’:
Desde § 5.10 del estándar C++11:
Los punteros del mismo tipo (después de las conversiones de puntero) se pueden comparar para la igualdad. Dos punteros del mismo tipo se comparan iguales si y solo si ambos son nullambos apuntan a la misma función, o ambos representan la misma dirección (3.9.2).
(Omitiendo detalles sobre la comparación de punteros al miembro y/o al null constantes de puntero: continúan en la misma línea de ‘Haz lo que quiero decir’ 🙂
- […] Si ambos operandos son null, se comparan iguales. De lo contrario, si solo uno es nullse comparan desiguales.[…]
La advertencia más ‘conspicua’ tiene que ver con los virtuales, y también parece ser lo lógico de esperar:
- […] si cualquiera es un puntero a una función de miembro virtual, el resultado no se especifica. De lo contrario, se comparan iguales si y solo si se referirían al mismo miembro del mismo objeto más derivado (1.8) o al mismo subobjeto si fueran desreferenciados con un objeto hipotético del tipo de clase asociado. […]
Operadores relacionales (<,>,<=,>=)
Desde § 5.9 del estándar C++11:
Los punteros a objetos o funciones del mismo tipo (después de las conversiones de puntero) se pueden comparar, con un resultado definido de la siguiente manera:
- Si dos punteros p y q del mismo tipo apuntan al mismo objeto o función, o ambos apuntan uno más allá del final del mismo arrayo son ambos
nullluegop<=q
yp>=q
ambos rinden true yp
yp>q
ambos rinden false.- Si dos punteros p y q del mismo tipo apuntan a diferentes objetos que no son miembros del mismo objeto o elementos del mismo array o a diferentes funciones, o si sólo una de ellas es nullLos resultados de
p
p>q,
p<=q,
y
p>=q
no están especificados.- Si dos punteros apuntan a no-static miembros de datos del mismo objeto, o a subobjetos o array elementos de dichos miembros, recursivamente, el puntero al miembro declarado más tarde se compara mayor siempre que los dos miembros tengan el mismo control de acceso (Cláusula 11) y siempre que su clase no sea una unión.
- Si dos punteros apuntan a no-static miembros de datos del mismo objeto con diferente control de acceso (Cláusula 11), el resultado no se especifica.
- Si dos punteros apuntan a no-static miembros de datos del mismo objeto de unión, se comparan iguales (después de la conversión a
void*
, si necesario). Si dos punteros apuntan a elementos del mismo array o uno más allá del final de la arrayel puntero al objeto con el subíndice más alto se compara más alto.- No se especifican otras comparaciones de punteros.
Entonces, si tuvieras:
int arr[3];
int *a = arr;
int *b = a + 1;
assert(a != b); // OK! well defined
También está bien:
struct X int x,y; s;
int *a = &s.x;
int *b = &s.y;
assert(b > a); // OK! well defined
Pero depende del something
en tu pregunta:
int g;
int main()
int h;
int i;
int *a = &g;
int *b = &h; // can't compare a <=> b
int *c = &i; // can't compare b <=> c, or a <=> c etc.
// but a==b, b!=c, a!=c etc. are supported just fine
Bonificación: ¿qué más hay en la biblioteca estándar?
§ 20.8.5/8: "Para plantillas greater
, less
, greater_equal
y less_equal
las especializaciones para cualquier tipo de puntero generan un orden total, incluso si los operadores incorporados <
, >
, <=
, >=
no."
Por lo tanto, puede globalmente pedido cualquier impar void*
siempre y cuando uses std::less<>
y amigos, no desnudos operator<
.
Sí, esa es la definición de igualdad de puntero sin procesar: ambos apuntan a la misma ubicación (o son alias de puntero); generalmente en el espacio de direcciones virtuales del proceso que ejecuta su aplicación codificada en C ++ y administrada por algún sistema operativo (pero C ++ también se puede usar para programar dispositivos integrados con microcontroladores que tienen una arquitectura Harward: en tales microcontroladores algunos punteros están prohibidos y no tiene sentido, ya que los datos de solo lectura podrían estar en el código ROM)
Para C++, lea un buen libro de programación de C++, consulte este sitio web de referencia de C++, lea la documentación de su compilador de C++ (quizás GCC o Clang) y considere codificar con punteros inteligentes. Tal vez lea también algún borrador del estándar C++, como n4713 o compre el estándar oficial de su representante ISO.
Los conceptos y la terminología de la recolección de basura también son relevantes al administrar punteros y zonas de memoria obtenidas por asignación dinámica (por ejemplo, ::operator new
), así que lea quizás el manual de GC.
Para punteros en máquinas Linux, vea también esto.
los ==
El operador de los punteros comparará su dirección numérica y, por lo tanto, determinará si apuntan al mismo objeto.
Comentarios y valoraciones
Si posees algún titubeo y disposición de mejorar nuestro ensayo eres capaz de añadir una nota y con gusto lo ojearemos.