Uso de sizeof en lenguaje c
Este es un valor que depende del sistema de compilación, generalmente definido como typedef unsigned int size_t; hay muchos compiladores, pero como typedef unsigned int size_t; Unas especificaciones, todas garantizan carbón y firmadas.
El valor sizeof de char y unsigned char es 1. Después de todo, char es el tipo de datos más pequeño que se puede utilizar en programación.
La explicación de MSDN es:
La palabra clave sizeof proporciona los tipos disponibles o
(incluidos los tipos agregados). Esta palabra clave devuelve un valor de tipo
size_t.
2. Gramática:
Sizeof tiene tres formas gramaticales, como sigue:
1) sizeof (objeto); //sizeof (objeto); p>
2) tamaño de (tipo_nombre); // tamaño de (tipo);
3) tamaño del objeto; // tamaño del objeto
Entonces hablemos de los tres tamaños de; correcto.
El código de copia es el siguiente:
#includes
main()
{
int b;
printf("dn",tamañode(b));
printf("dn",tamañode(b));
printf(" dn",sizeof( int));
}
4. Tamaño de los tipos de datos básicos
Los tipos de datos básicos aquí se refieren a short, int, long , flotante y doble, etc. Tipos de datos integrados simples, como son todos los sistemas.
Depende del sistema, por lo que los valores bajo diferentes sistemas pueden ser diferentes, lo que debe llamar nuestra atención y tratar de evitarlo.
Este aspecto trae problemas al trasplante de. su propio programa. Normalmente, en un entorno de compilación de 32 bits, el valor de sizeof(int) es 4.
5. El tamaño de la variable del puntero
es igual al ancho del bus de direcciones interno de la computadora. Por lo tanto, en una computadora de 32 bits, el valor de retorno de la variable de puntero debe ser 4 (tenga en cuenta que el resultado se basa en
Bytes. Es previsible que el tamaño del resultado de la variable de puntero sea). 8 en futuros sistemas de 64 bits.
El valor sizeof de la variable del puntero no tiene nada que ver con el objeto señalado por el puntero, solo porque todas las variables del puntero ocupan el mismo tamaño de memoria, por lo que
El procesamiento de mensajes MFC La función puede utilizar los dos parámetros WPARAM y LPARAM (usando
punteros a estructuras).
6. El tamaño de la matriz
El valor del tamaño de la matriz es igual al número de bytes de memoria ocupados por la matriz, por ejemplo:
char a 1【】="ABC" ;
int a2[3];
sizeof(a 1); //El resultado es 4 y hay un terminador nulo en El final del personaje.
sizeof(a2); //El resultado es 3*4=12 (depende de int)
Sizeof no encuentra correctamente el número de elementos de la matriz. Hay dos formas de contar el número de elementos de una matriz: int c 1 = sizeof(a 1).
/sizeof(char); //Longitud total/longitud de un solo elemento
int C2 = sizeof(a 1)/sizeof(a 1【0】); Longitud total/longitud del primer elemento. Tenga en cuenta que el nombre de la matriz se pasa como argumento de función.
El tiempo degenera en un puntero.
7. Tamaño de la estructura
Estructura S1
{
char c;
int I;
p>};
El resultado de sizeof es igual al número de bytes de memoria ocupados por el objeto o tipo. Bien, echemos un vistazo a la asignación de memoria de S1: S1 s1.
= {'a', 0x ffffffff}; La dirección de s1 es 0x0012FF78 y su contenido de datos es el siguiente:
0012f 78:61 CCC cc ff ff ff Hay 3 bytes en el medio. Eche un vistazo a la descripción en MSDN: cuando se aplica a
tipos de estructura o variables, sizeof devuelve el tamaño real, posiblemente
incluyendo bytes de relleno para la alineación.
¡Esto es alineación de bytes! ¿Por qué es necesaria la alineación de bytes? Los principios de composición de la computadora nos dicen que esto ayudará a acelerar la velocidad de recuperación de datos de la computadora, que de otro modo requeriría más ciclos de instrucción. Entonces, el compilador manejará esa estructura de forma predeterminada (en realidad, los números en otros lugares muestran variables), dejará que los tipos de datos básicos (cortos, etc.) estén en direcciones divisibles por 2 y dejará que el ancho sea 4 tipos de datos básicos.
Todos los tipos de datos (int, etc.) están ubicados en direcciones divisibles por 4, y así sucesivamente. De esta manera, es posible la mitad de dos números.
Es necesario agregar bytes de relleno, por lo que aumentará el tamaño del valor de toda la estructura.
1 y sizeof son operadores, que en realidad son lo mismo que suma, resta, multiplicación y división. Se ejecutan en tiempo de compilación, no en tiempo de ejecución.
¿Y qué si esto se verificara en la programación?
Copia el código de la siguiente manera:
#Include
Usar espacio de nombres std
int main()
{
int I = 1;
cout lt
tamañode(I);
cout lt
Devuelve 1;
}
El resultado de entrada es 1.
1
Los efectos secundarios de i en sizeof no se muestran porque solo hay una razón posible. Después de ejecutar sizeof en tiempo de compilación, se procesa i y se eliminan los efectos secundarios de i. Si sizeof se ejecuta en tiempo de ejecución, debe tener cuidado. En realidad, la implementación de sizeof debe realizarse mediante macros, que se ejecutan en tiempo de compilación. Para una implementación específica, consulte el siguiente contenido.
2. El resultado de sizeof('a') es 4 en lenguaje C y 1 en C. He leído un artículo que dice que sizeof en C se centra en números, mientras que sizeof en C se centra más en caracteres.
3. Este artículo analiza dos aplicaciones clásicas del tamaño del uso de macros.
Copia el código de la siguiente manera:
//Para no matrices
#define_sizeof(T)((size_T)(T*)0 1 ))
//Para matrices
# define array_sizeof(T)((size_T)(amp;t 1)(amp;t)
Da dos pequeños ejemplos para ilustrar la aplicación de las dos macros, como_sizeof(int); para el segundo ejemplo, declare una matriz INTA[4] con un tamaño de 4; ) es 16.
Para definiciones de macros que no son de matriz, 0 se convierte primero a la dirección apuntada por el puntero de tipo T* (la dirección es 0 en este momento) y luego al tipo T. Sumando 1 a la dirección equivale a sumar el tamaño del tipo T (es decir, el tamaño de T que no es de matriz).
El size_t anterior simplemente devuelve la dirección como un número entero de tipo int.
Un ejemplo simple: int * p;; p = p 1; -p es un puntero int* y p 1 equivale a agregar 4 bytes al espacio de direcciones.
Las definiciones de macros de matriz son similares a las definiciones de macros que no son de matriz. Para facilitar la comprensión, la matriz T puede considerarse como un tipo definido por el usuario. t representa el puntero del tipo de matriz. Agregar 1 al puntero del tipo de matriz es equivalente a agregar el tamaño de la matriz a la dirección. Debido a que es un tipo definido por el usuario, no puede forzar 0 a una dirección de matriz. La dirección después de sumar 1 solo puede restar la dirección anterior, y la diferencia es el tamaño de bytes de los propios grupos.
Lectura ampliada: comprensión de las variables del lenguaje C
En primer lugar, el concepto de variables
Programación es hacer que la computadora funcione de acuerdo con ciertas instrucciones. Se puede decir que el procesamiento de datos es un programa. La tarea principal del diseño. Entonces, ¿cómo se agregan los datos a la memoria de la computadora? La función original de una computadora era una máquina que podía almacenar y procesar datos. Entonces, ¿cómo se agregan los datos a la memoria de la computadora? Es posible que muchos estudiantes ya estén familiarizados con las instalaciones de hardware informático antes de aprender a programar. Hay un área para almacenar datos en las instalaciones de hardware de la computadora. La computadora frecuentemente lee y saca datos de esta área cuando está funcionando. Para que la computadora funcione automáticamente de acuerdo con ciertas instrucciones (programas), primero se deben almacenar los datos en el espacio de almacenamiento de la computadora. Las variables se utilizan para implementar esta función de almacenamiento de datos en lenguajes informáticos. Las variables son unidades de almacenamiento en la memoria de la computadora.
2. Definición de variables
Las variables en lenguaje C deben definirse antes de su uso. La forma general de definición de variable es la siguiente: categoría de almacenamiento tipo de datos nombre de variable; la categoría de almacenamiento se puede omitir;
1. Categoría de almacenamiento La memoria de la computadora generalmente se divide en tres partes: 1) área de programa; 2) área de almacenamiento estático; 3) área de almacenamiento dinámico para ejercer eficientemente las funciones de la computadora; de almacenamiento de variables en diferentes áreas de memoria. La clase de almacenamiento de una variable determina dónde se almacenan los datos en la memoria de la computadora. En lenguaje C, las variables locales se almacenan en un área de almacenamiento dinámico y las variables globales o variables estáticas se almacenan en un área de almacenamiento estática.
2. Tipo de datos Antes de utilizar un programa para manejar un problema, primero debe determinar cómo describir los datos involucrados en el problema. Este problema está determinado por los tipos de datos en lenguaje C. La esencia de las variables es el tiempo de existencia y el espacio de almacenamiento en la computadora. El tipo de datos de una variable se utiliza para determinar la cantidad de espacio de memoria que ocupa la variable en la computadora. Por ejemplo, en el sistema de compilación TC, los datos enteros ocupan dos bytes de espacio de almacenamiento. El tipo de variables del lenguaje C no solo determina el tamaño del área de almacenamiento de datos en la memoria de la computadora, sino que también determina las diversas operaciones en las que pueden participar los datos. Cualquier variable en lenguaje C debe tener un tipo de datos explícito. No importa cómo cambie la variable, el valor de la variable debe ajustarse al tipo de datos de la variable.
3. El nombre de la variable. A través de la introducción anterior, sabemos que la variable es una unidad de almacenamiento de la computadora en lenguaje C. Supongamos que asigna un valor a una variable y el procesamiento de la variable es en realidad el procesamiento de los datos. Entonces, ¿cómo encuentra una computadora estos datos de forma rápida y precisa? La memoria de una computadora se divide en bytes. Cada unidad de almacenamiento tiene su propio número de dirección, al igual que una habitación de hotel tiene un número de habitación. Las computadoras usan direcciones para determinar exactamente dónde se almacenan los datos. Pero para los programadores, especialmente los informáticos no profesionales, es muy difícil registrar datos utilizando direcciones de memoria de computadora.
Para poder controlar mejor las variables, el lenguaje C estipula que a cada variable se le puede dar un nombre fácilmente identificable. Las reglas de nomenclatura para este nombre siguen las reglas de nomenclatura para identificadores en el lenguaje C. Bajo la premisa de seguir las reglas de identificación del lenguaje C, la denominación de nombres de variables en lenguaje C puede, en principio, ser una combinación de caracteres de cualquier longitud. Sin embargo, muchos sistemas de compilación de lenguaje C actuales solo pueden reconocer los primeros 365,438 0 caracteres. Si los primeros 365, 438 0 caracteres de dos variables son iguales, el sistema de compilación pensará que las dos variables son la misma variable. Para evitar esta confusión, es mejor evitar el uso de nombres de variables de más de 31 caracteres. Las variables son unidades de almacenamiento en las computadoras.
Definir una variable esencialmente asigna un área de almacenamiento de la computadora. El tamaño del área de almacenamiento está determinado por el tipo de datos de la variable y la ubicación del área de almacenamiento está determinada por la categoría de clase de almacenamiento de la variable. Asignar un valor a una variable en realidad significa leer datos en la unidad de almacenamiento correspondiente a la variable, y procesar la variable significa procesar los datos en esta unidad de almacenamiento. Y los datos en esta unidad de almacenamiento pueden cambiar mientras el programa se está ejecutando.