Explicación detallada de las palabras clave del lenguaje C (3) Tipo de datos y tamaño de la palabra clave

I. Introducción

Hola a todos, bienvenidos a la columna de análisis en profundidad del lenguaje C: la tercera parte de la explicación detallada de la palabra clave del lenguaje C. En este artículo, presentaremos los tipos de datos en el lenguaje C y, por lo tanto, conduciremos a otra palabra clave importante en el lenguaje C. idioma — tamaño de .

En segundo lugar, el tipo de datos.

1. ¿Cuáles son los tipos de datos?

Los tipos de datos en lenguaje C incluyen tipos primitivos (tipos integrados), tipos construidos (tipos personalizados), tipos de puntero y tipos nulos
inserte la descripción de la imagen aquí

2. ¿Por qué necesitamos tipos de datos?

¿Por qué tener tipos incorporados?

Nos encontramos con varios escenarios en nuestra vida diaria, y diferentes escenarios requieren diferentes datos para representarlos, como la cantidad de personas que cenamos, la temperatura del clima, la altitud y otras cosas que generalmente se describen con números enteros, como la altura de un persona, la frecuencia de transmisión y el precio de los bienes generalmente se expresan en decimales. Por ejemplo, nuestro número de placa, el nombre del edificio y el tamaño de la ropa deben expresarse en letras; lenguaje C, como el primero lenguaje de programación de alto nivel, para poder describir con precisión varios escenarios en nuestras vidas, hay tipos incorporados como números enteros, tipos de punto flotante y tipos de caracteres.

¿Por qué tener tipos personalizados?

Tomemos como ejemplo el tipo de matriz y el tipo de estructura en el tipo personalizado:
Tipo de matriz: encontraremos muchos conjuntos del mismo tipo en nuestra vida, como el número de estudiante de un estudiante de la escuela, y el número de estudiante de cada estudiante es un número entero, por lo que para representar los números de estudiantes de todos los estudiantes, es necesario definir miles de números enteros. Obviamente, eso es demasiado problemático, por lo que se genera un tipo de matriz. El tipo de cada elemento en una matriz es el mismo Estamos definiendo la estructura de un estudiante Cuando eres un estudiante, solo necesitas definir una matriz con un tamaño de varios miles de elementos, en lugar de definir lentamente miles de
tipos de estructuras enteras: los objetos que queremos describir en nuestras vidas a menudo son colecciones de tipos de datos complejos. Por ejemplo, una persona tiene nombre, sexo, altura, peso, edad, etc. Estos tipos de datos son todos diferentes, por lo que para describir sistemáticamente los atributos de una persona, se genera un tipo de estructura, que convierte una persona a diferentes tipos Todos los datos se centralizan en un nuevo tipo, lo que hace que la descripción y el uso del objeto sean más convenientes.

3. Cómo tratar los tipos de datos

Del blog anterior, sabemos que la esencia de definir variables es abrir un espacio en la memoria para almacenar datos, y hoy sabemos que las diferentes variables deben definirse como diferentes tipos. Combinando los dos, no lo haremos. Es difícil salir: el tipo determina el tamaño del espacio abierto por la variable.
En este momento, hay dos preguntas. Primero, ¿por qué deberíamos abrir un espacio según el tipo? Podemos abrir un espacio directamente y usar la memoria como un todo, ¿verdad? La respuesta es: no es bueno.
Hay dos razones principales:
1. En cualquier momento, su computadora no solo está ejecutando el programa que está usando actualmente, hay muchos otros programas ejecutándose al mismo tiempo, si el bloque completo se asigna a su programa actualmente en ejecución, otros programas choque.
2. Incluso si se le asigna todo el bloque de memoria, no puede garantizar que el bloque de memoria se agote en cualquier momento, lo que conducirá a una pérdida de memoria.
Segundo, usamos parte de la memoria, ¿cuánto es usado por qué? La respuesta es: está determinada por su escenario, su escenario de cálculo y qué tipo de variables utiliza para el cálculo. El tipo que usa determina cuántos bytes de espacio abre. Esta es la razón por la cual el lenguaje C tiene tantos tipos de datos, solo para cumplir con diferentes escenarios informáticos.
Finalmente, ¿cuánto espacio abren diferentes tipos de datos en la memoria? Esto debe calcularse utilizando nuestra palabra clave: sizeof.

Three, sizeof - Calcula el tamaño del espacio abierto por diferentes tipos de variables

1. El tamaño del espacio abierto por tipos incorporados

`#include<stdio.h>
int main()
{
    
    
	printf("%d\n", sizeof(char));       //1
	printf("%d\n", sizeof(short));      //2
	printf("%d\n", sizeof(int));        //4
	printf("%d\n", sizeof(long));       //4
	printf("%d\n", sizeof(long long));  //8
	printf("%d\n", sizeof(float));      //4
	printf("%d\n", sizeof(double));     //8
}`

inserte la descripción de la imagen aquí

2. El tamaño del espacio abierto por el tipo personalizado

tamaño de matriz

#include<stdio.h>
int main()
{
    
    
	int arr1[10] = {
    
     0 };       //40
	char arr2[10] = {
    
     0 };      //10
	long int arr3[10] = {
    
     0 };  //40
	long long arr4[10] = {
    
     0 }; //80
	float arr5[10] = {
    
     0 };     //40
	double arr6[10] = {
    
     0 };    //80
	printf("%d\n", sizeof(arr1));
	printf("%d\n", sizeof(arr2));
	printf("%d\n", sizeof(arr3));
	printf("%d\n", sizeof(arr4));
	printf("%d\n", sizeof(arr5));
	printf("%d\n", sizeof(arr6));
	return 0;
}

inserte la descripción de la imagen aquí

De los resultados anteriores podemos dibujar fácilmente: el tamaño de la matriz = el tipo de los elementos de la matriz multiplicado por el número de elementos

Otros tamaños de letra personalizados

#include<stdio.h>
struct Test1{
    
    
	int a;
	char b;
	float c;
	double d;
};
union Test2{
    
    
	int m;
	char n;
};
enum Test3 {
    
    
	monday,
	tuesday,
	wednesday,
	thursday,
	frifay
};
int main()
{
    
    
	struct Test1 test1 = {
    
     0 };
	union Test2 test2 = {
    
     0 };
	enum Test3 test3;
	printf("%d\n", sizeof(test1));   //24
	printf("%d\n", sizeof(test2));   //4
	printf("%d\n", sizeof(test3));   //4
}

Presumiblemente, los resultados anteriores son diferentes de los resultados en la mente de algunos socios pequeños. De hecho, el tamaño de los tipos personalizados, como estructuras, uniones y enumeraciones, y el tamaño de la matriz no son los mismos. Los métodos específicos involucran la alineación de la memoria. y tamaño Terminal, asignación de memoria y otros conocimientos relacionados, estos conocimientos son más complicados, lo explicaré en el módulo detallado de tipo personalizado, y ahora no necesita entrar en él.

3. El tamaño del espacio abierto por el tipo de puntero

inserte la descripción de la imagen aquíinserte la descripción de la imagen aquí

Como puede ver, independientemente del tipo de puntero (entero, carácter, coma flotante, matriz), el tamaño del puntero siempre es de cuatro u ocho bytes (la primera imagen X86 representa una plataforma de 32 bits, el resultado es 4, la segunda imagen X64 representa la plataforma de 64 bits, el resultado es 8), por lo que la conclusión es: el puntero está 4 bytes en la plataforma de 32 bits y 8 bytes en la plataforma de 64 bits. (En cuanto a por qué este es el caso, esto implica el conocimiento del direccionamiento de la memoria, las líneas de dirección, etc. Explicaré esta parte en detalle en el puntero. Ahora solo necesita recordar esta conclusión)
Nota: La segunda imagen tiene una advertencia Es porque mi computadora es una plataforma de 32 bits, y forzarla a 64 bits causará una discrepancia de tamaño.

4. El tamaño del espacio abierto por el tipo vacío

inserte la descripción de la imagen aquí

Podemos ver que aunque el compilador reporta un error aquí, todavía imprime el tamaño de void: 0
bytes El resultado puede ser diferente en diferentes entornos de programación, por ejemplo, en el entorno Linux, el tamaño del tipo de vacío es 1 (debido a la limitación de nivel, no se puede demostrar aquí por el momento); La razón fundamental de la diferencia es que los diferentes entornos de compilación tienen diferentes grados de soporte para el lenguaje C.

4. Mayor comprensión del tamaño de

1. ¿Por qué sizeof no es una función?

inserte la descripción de la imagen aquíinserte la descripción de la imagen aquí

De lo anterior, podemos ver que podemos usar sizeof(a) y sizeof(int) para encontrar el tamaño de un número entero. Este método también es familiar para todos, pero descubrimos que
sizeof a también se puede usar para encontrar el tamaño de a directamente, y No se necesitan paréntesis, por lo que sizeof es una palabra clave (operador) pero no una función, porque los parámetros de función deben ser () para usarse correctamente.
Nota: sizeof int informa un error porque sizeof e int son palabras clave y no puede usar una palabra clave para encontrar el tamaño de otra palabra clave

2. Otros usos de sizeof

inserte la descripción de la imagen aquí

Aquí definimos una variable entera a y una variable puntero p, así como una matriz arr.Podemos ver que el tamaño de a es 4 y el tamaño de arr es 40. Todos entendemos esto,
luego el tamaño restante de §, tamaño de (&arr), ¿Qué significa sizeof(arr) / sizeof(arr[0])? La siguiente es una explicación para todos (que involucra conocimientos relacionados con el puntero)

p es una variable puntero, que almacena la dirección de a, arr nombre de matriz indica la dirección (memoria) del primer elemento de la matriz arr, &arr indica la dirección de toda la matriz, que es equivalente a un puntero de matriz, por lo que sizeof § y sizeof(&arr) Ambos son del tamaño del puntero buscado y, como sabemos anteriormente, el puntero tiene 4 bytes en la plataforma de 32 bits, por lo que el resultado aquí es 4.
Finalmente, sizeof(arr) encuentra el tamaño de toda la matriz, y sizeof(arr[0]) encuentra el tamaño del primer elemento, por lo que dividir los dos da como resultado 10 elementos de la matriz.
Nota: sizeof(arr[0]) se usa aquí para encontrar el tamaño de un elemento de matriz, en lugar de arr[1], arr[2] porque no sabemos cuántos elementos tiene la matriz, así que tal vez arr[1 ], arr [2] no existe en absoluto, pero siempre que la matriz esté definida, entonces arr[0] debe existir, es decir, se hace por seguridad.


Más palabras clave están en el enlace del blog a continuación
.

         码字不易,求个三连

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/m0_62391199/article/details/123584280
Recomendado
Clasificación