¿Por qué se usa * para declarar punteros?
Elimina la indirección, pero no elimina ninguna cuando declara un puntero como int *a = &b , ¿no debería eliminar la indirección de &b ?
Muchos símbolos en C y C++ están sobrecargados. Es decir, sus significados dependen del contexto donde se utilicen. Por ejemplo, el símbolo & puede denotar la dirección del operador y el operador AND binario bit a bit.
El símbolo * utilizado en una declaración denota un puntero:
int b = 10; int *a = &b,pero usado en expresiones, cuando se aplica a una variable de tipo puntero, denota el operador de desreferencia, por ejemplo:
printf( "%d\n", *a );También puede denotar el operador de multiplicación, por ejemplo, puede escribir:
printf( "%d\n", b ** a );eso es lo mismo que
printf( "%d\n", b * *a );De manera similar, el par de llaves cuadradas se puede usar en una declaración de una matriz, como:
int a[10];y como operador de subíndice:
a[5] = 5;Cada vez que tenga una declaración de puntero con una inicialización como esta:
type *x = expr;es equivalente a la inicialización separada seguida de la asignación:
type *x; x = expr;no es equivalente a
type *x; *x = expr; /* WRONG */Es parte de la declaración, por lo que no es un operador de desreferencia en absoluto. Sin embargo, todavía significa lo mismo.
int *ase puede leer como
El valor apuntado por
aes unint.
al igual que
printf("%d\n", *a);se puede leer como
Imprime el valor apuntado por
a.
Consulte esta respuesta a la forma correcta de declarar variables de puntero en C/C++ para obtener información sobre esto.