pointer length initialize array c++ arrays char static-array

length - return array c++



Diferencia entre char y char (3)

Además de las diferencias de notación en el uso enfatizadas por Steve, char [1] puede pasarse a, por ejemplo, template <int N> void f(char(&a)[N]) , donde char x = ''/0''; f(&x); char x = ''/0''; f(&x); no coincidiría Capturar de forma confiable el tamaño de los argumentos de matriz es muy conveniente y tranquilizador.

También puede implicar algo diferente: o bien que la longitud real puede ser más larga (como lo explica dmckee), o que el contenido es lógicamente una cadena ASCIIZ (que en este caso está vacía) o una matriz de caracteres (eso sucede). tener un elemento). Si la estructura era una de varias estructuras relacionadas (por ejemplo, un vector matemático donde el tamaño de la matriz era un argumento de plantilla, o una codificación del diseño de la memoria necesaria para alguna operación de E / S), es posible que exista alguna similitud con otros campos donde las matrices pueden ser más grandes sugeriría una preferencia por una matriz de un solo carácter, permitiendo que el código de soporte sea más simple y / o más universalmente aplicable.

En C ++, cuál es la diferencia (si la hay) entre usar char y char [1].

ejemplos:

struct SomeStruct { char x; char y[1]; };

¿Siguen las mismas razones para char sin signo?


La principal diferencia es solo la sintaxis que usa para acceder a su char.

Con "acceso" me refiero a actuar sobre él usando los diversos operadores en el idioma, la mayoría o todos hacen cosas diferentes cuando se aplica a un char comparación con un arreglo de caracteres. Esto hace que suene como si x y casi completamente diferentes. De hecho, ambos "consisten en" un char, pero ese char ha sido representado de una manera muy diferente.

La implementación podría causar que haya otras diferencias, por ejemplo, podría alinear y rellenar la estructura de forma diferente según la que use. Pero dudo que lo haga.

Un ejemplo de las diferencias entre operadores es que un carácter es asignable y un conjunto no:

SomeStruct a; a.x = ''a''; a.y[0] = ''a''; SomeStruct b; b.x = a.x; // OK b.y = a.y; // not OK b.y[0] = a.y[0]; // OK

Pero el hecho de que y no sea asignable no impide que SomeStruct sea ​​asignable:

b = a; // OK

Todo esto es independientemente del tipo, char o no. Un objeto de un tipo y un conjunto de ese tipo con el tamaño 1 son prácticamente iguales en términos de lo que hay en la memoria.

Como un lado, hay un contexto en el que hace una gran diferencia que "usas" fuera de char y char[1] , y que a veces ayuda a confundir a las personas para que piensen que las matrices son realmente punteros. No es tu ejemplo, sino como un parámetro de función:

void foo(char c); // a function which takes a char as a parameter void bar(char c[1]); // a function which takes a char* as a parameter void baz(char c[12]); // also a function which takes a char* as a parameter

Los números provistos en las declaraciones de bar y baz son completamente ignorados por el lenguaje C ++. Al parecer, alguien en algún momento consideró que sería útil para los programadores como una forma de documentación, lo que indica que la función baz espera que su argumento apunta al primer elemento de una matriz de 12 caracteres.

En bar y baz, c nunca tiene tipo de matriz: parece un tipo de matriz, pero no lo es, es simplemente una sintaxis de casos especiales con el mismo significado que char *c . Por eso puse las comillas en "usar": en realidad no estás usando char[1] , parece que sí.


Si realmente ha visto el constructo char y[1] como el último miembro de una estructura en el código de producción, entonces es bastante probable que haya encontrado una instancia del struct hack .

Esa matriz corta es un sustituto de una matriz de longitud real pero de longitud variable (recuerde que antes de c99 no existía tal cosa en el estándar c). El programador siempre asignaría tales estructuras en el montón, teniendo cuidado de asegurar que la asignación fuera lo suficientemente grande para el tamaño real de la matriz que quería usar.