Si necesito iterar sobre una matriz en C, puedo hacer algo como:
void uselessTest(const char *p) { while(*p) { ++p; } }Me pregunto qué significa eso en detalle:
if (*p != null) ?p = p + 1 , ¿qué significa eso? ¿Pa es un valor numérico? *p debe ser el valor señalado y p la dirección del puntero? Entonces, en este ciclo, p cambia mientras que *p permanece igual.¿Prueba, en cada ciclo, si (*p != null) ?
Diría que es más correcto decir que comprueba si *p!=0 .
Si p = p + 1, ¿qué significa eso? ¿Pa es un valor numérico?
Parece que el estándar C no define qué puntero es internamente. Pero en el siguiente ejemplo, supondré que p tiene una dirección representada como un número entero (que suele ser el caso). En ese caso, en su ejemplo anterior, cuando le agrega uno, p se mueve a la siguiente dirección, por ejemplo, si p fuera 0x1000, después del incremento se convertiría en 0x1001 (Esto se debe a que el tamaño del char es 1, en caso de que p fuera puntero a int se movería cuatro bytes hacia adelante * -el tamaño dado del entero es cuatro).
Entonces, en este ciclo, p cambia mientras que *p permanece igual.
No, de hecho *p intenta desreferenciar p , en otras palabras, obtener contenidos del objeto almacenado en la dirección p . Entonces, por supuesto, si cambia el valor de p , también puede obtener contenido diferente en la nueva dirección. por ejemplo, si el valor inicial de p era 0x1000, después del incremento, será 0x1001 y *p intentará leer el valor en 0x1001, que podría ser diferente del valor almacenado en 0x1000.
* Busque aritmética de punteros para obtener más detalles al respecto
Comprueba en cada iteración si *p != null) y finaliza el ciclo si es nulo.
Aumenta el puntero, ergo, el puntero apunta a la siguiente dirección. Entonces, al usar un ciclo como este, puede iterar sobre los elementos en una matriz.
Entonces, básicamente, lo que hace este ciclo: itera sobre los caracteres en la matriz, hasta que alcanza un carácter \0 de terminación. En cada iteración, el puntero p se incrementa para apuntar al siguiente carácter.
¿Prueba, en cada ciclo, si (*p != null) ?
No hay un null en C. Hay un terminador NUL ( '\0' ) y NULL . Este último está asociado con punteros.
el cheque es
if (*p != 0)que es lo mismo que
if (*p != '\0')Si p = p + 1, ¿qué significa eso?
Mueve el puntero sizeof(*p) bytes hacia adelante.
¿Pa es un valor numérico?
p es un const char* , o en otras palabras, un puntero a char .
*p debe ser el valor señalado y p la dirección del puntero?
*p son los datos a los que apunta el puntero p y p es la dirección a la que apunta el puntero (que es diferente de la dirección de p )