Las declaraciones de C se basan en los tipos de expresiones , no en objetos.
Si usted tiene un puntero a un int
llamado pi
, y desea acceder al valor entero que apunte a, hay que eliminar la referencia al puntero, como en:
x = *pi;
printf("%d", *pi);
*pi = 1 + 2;
etc.Tipo de la expresión *pi
es int
: por lo tanto, la declaración debe decir lo
int *pi;
Ahora vamos a suponer que tenía una matriz de punteros a char
; para llegar a cualquier carácter, es necesario primer subíndice en la matriz, a continuación, eliminar la referencia al resultado:
c = *pc[i];
if (*pc[j] == 'a') {...}
etc. Una vez más, el tipo de la expresión *pc[i]
es char
, por lo que la declaración dice lo
char *pc[N];
Tanto *pi
y *pc[N]
son conocidos como declaradores y especifique la información de tipo adicional no propuesta por el especificador de tipo. IOW, la matriz y el puntero-ness de pc
se especifican como parte del declarador, mientras que el char
-ness viene dado por el especificador de tipo.
En cuanto a la cuestión de cuál es el estilo es adecuado ...
Ninguno de los dos es "correcto", pero yo (y muchos otros programadores C) prefieren escribir T *p
en contraposición a T* p
, ya que refleja más de cerca la gramática del lenguaje (el *
es parte del declarador) y ayuda a evitar confusiones al declarar varios elementos. He visto ahora demasiados ejemplos de personas escribiendo T* a, b;
y esperando que b
sea un puntero.
La respuesta habitual a esa crítica es "no declare más de un artículo por línea". Mi respuesta a esa respuesta es "escriba sus declaradores correctamente y no tendrá ningún problema".
Hay una escuela de pensamiento diferente entre muchos programadores de C++, que prefieren el estilo T* p
, y tengo que decir que hay algunos casos (limitados a C++) donde puede que el código sea más legible.
Sin embargo, eso solo funciona con punteros simples a T
: el paradigma se descompone rápidamente cuando comienza a tratar con matrices de punteros, punteros a matrices o punteros a funciones o punteros a matrices de punteros a funciones, etc. Quiero decir, escribir algo como
T* (*(*p)[N])(); // p is a pointer to an array of pointers to functions
// returning pointers to T.
solo indica un pensamiento confuso. Aunque, si muy muy muy siente que debe seguir el paradigma T* p
, siempre se puede crear una serie de typedefs:
EDITAR
Vamos a intentarlo de nuevo:
typedef T* TPtr; // pointer to T
typedef TPtr TPtrFunc(); // function returning pointer to T
typedef TPtrFunc* TPtrFuncPtr; // pointer to function returning
// pointer to T
typedef TPtrFuncPtr TPtrFuncPtrArray[N]; // N-element array of pointer to function
// returning pointer to T
TPtrFuncPtrArray* p;
Por el amor de Dios, no hagas eso.
No sé por qué la gente vota para cerrar esto.Suena como una pregunta legítima para mí, pero luego solo he estado pirateando a C desde 1980. –
@ PeterRowell: el único problema con este tipo de preguntas triviales es que uno puede encontrar la respuesta en línea con google o cualquier otra búsqueda motor en cuestión de segundos. Y cualquier libro decente sobre C debe explicar esto también. ¿Por qué no usarlos? No voté para cerrarlo, sin embargo. –
posible duplicado de [¿Importa dónde coloque el asterisco al declarar punteros en C++?] (Http://stackoverflow.com/questions/5449908/does-it-matter-where-i-place-the-asterisk-when -declaring-pointers-in-c) –