== para la comparación del puntero
pointers comparison (5)
El operador de igualdad se define para todos los punteros válidos, y el único momento en que puede dar un "falso positivo" es cuando un puntero apunta a un elemento más allá del final de un conjunto, y el otro pasa al punto (o puntos en virtud de un definición de estructura) a otro objeto almacenado justo después de la matriz en la memoria.
Creo que tu error es tratar a K & R como normativo. Consulte el estándar C99 (buena versión html aquí: http://port70.net/~nsz/c/c99/n1256.html ), 6.5.9 en el operador de igualdad. El problema de que las comparaciones no se definan solo se aplica a los operadores relacionales (ver 6.5.8):
Cuando se comparan dos punteros, el resultado depende de las ubicaciones relativas en el espacio de direcciones de los objetos apuntados. Si dos punteros a objetos o tipos incompletos apuntan al mismo objeto, o ambos señalan uno pasado el último elemento del mismo objeto de matriz, se comparan iguales. Si los objetos apuntados son miembros del mismo objeto agregado, los punteros a los miembros de estructura declarados posteriormente comparan mayor que los punteros con los miembros declarados anteriormente en la estructura, y los punteros a los elementos de matriz con valores de subíndices más grandes comparan mayor que los punteros a elementos de la misma matriz con valores de subíndice más bajos Todos los apuntadores a miembros del mismo objeto de unión se comparan iguales. Si la expresión P apunta a un elemento de un objeto de matriz y la expresión Q apunta al último elemento del mismo objeto de matriz, la expresión de puntero Q + 1 se compara mayor que P. En todos los demás casos, el comportamiento no está definido.
Cito de "The C Programming Language" de Kernighan & Ritchie:
Cualquier apuntador se puede comparar significativamente para igualdad o desigualdad con cero. Pero el comportamiento no está definido para la aritmética o las comparaciones con punteros que no apuntan a miembros de la misma matriz. (Hay una excepción: la dirección del primer elemento más allá del final de una matriz se puede usar en la aritmética del puntero).
¿Esto significa que no puedo confiar en ==
para verificar la igualdad de punteros diferentes? ¿Cuáles son las situaciones en las que esta comparación conduce a un resultado incorrecto?
Lo interpreto de la siguiente manera:
short a[9];
int b[12];
short * c = a + 9;
Aquí es válido decir que
c > a
porque c
resulta de a
aritmética via puntero,
pero no necesariamente eso
b == c
o
c <= b
o algo parecido, porque resultan de diferentes matrices, cuyo orden y alineación en la memoria no está definido.
No puede usar la comparación de punteros para comparar punteros que apuntan a diferentes matrices.
Asi que:
int arr[5] = {1, 2, 3, 4, 5};
int * p = &arr[0];
int anotherarr[] = {1, 2};
int * pf = &anotherarr[0];
No se puede hacer if (p == pf)
ya que p
y pf
no apuntan a la misma matriz. Esto conducirá a un comportamiento indefinido.
Puede confiar en la comparación de punteros si apuntan dentro de la misma matriz.
No estoy seguro acerca de la caja aritmética yo mismo.
Puede hacer ==
y !=
Con punteros de diferentes matrices.
<, <=,>,> = no está definido.
Un ejemplo que me viene a la mente es la arquitectura de Harvard con espacios de direcciones separados para el código y para los datos. En computadoras de esa arquitectura, el compilador puede almacenar datos constantes en la memoria de códigos. Dado que los dos espacios de direcciones están separados, un puntero a una dirección en la memoria del código podría ser numéricamente igual a un puntero en la memoria de datos, sin apuntar a la misma dirección.