Tipo de datos en lenguaje C (2): construcción de un tipo de datos

Como se mencionó en el artículo anterior, existen tres tipos de tipos de datos del lenguaje C: tipos de datos básicos, tipos de datos construidos y tipos de puntero.
Los tipos de datos básicos se han descrito anteriormente, y este artículo presenta la construcción de tipos de datos. Los tipos de datos construidos se dividen además en tres tipos: tipo de matriz, tipo de estructura, tipo de unión y tipo de enumeración.
inserte la descripción de la imagen aquí

tipo de matriz

Antes que nada, necesitamos aclarar una pregunta, ¿por qué tenemos una matriz?
Por ejemplo: Ahora es necesario contar las calificaciones de 10 estudiantes, si se usa el tipo de datos básico para definir al menos 10 variables para almacenar estos datos, si hay 100 estudiantes, se requieren al menos 100 variables.

float a0,a1,a2,a3,a4,a5,a6,a7,a8,a9;

Cuando se utilizan tipos de datos básicos para definir variables, si hay muchas variables del mismo tipo, será más complicado definirlas. Si usa matrices para resolver los problemas anteriores, será muy conveniente,

float a[10];

Solo se necesita una declaración para realizar la definición de múltiples variables del mismo tipo. En contraste, se destacan las ventajas de los arreglos, por lo que necesitamos arreglos. Con este problema práctico, es más fácil para nosotros comprender el concepto de matriz, una colección de datos del mismo tipo.
Matrices y elementos de matriz : una matriz es una colección de datos del mismo tipo representada por un nombre, y este nombre se denomina nombre de la matriz. Los datos de la matriz se almacenan en variables que se distinguen por subíndices, y estas variables se denominan variables de subíndice o elementos de matriz. Cada variable de subíndice es equivalente a una variable simple, y el tipo de la matriz también es el tipo de datos de la variable de subíndice de la matriz. La matriz pertenece al tipo de estructura y los datos del tipo de estructura se componen de los datos de tipo básico de acuerdo con ciertas reglas.
Las matrices utilizadas en el lenguaje C incluyen matrices unidimensionales y matrices multidimensionales.

matriz unidimensional

Definición de matriz unidimensional

Forma de definición:
nombre de matriz de tipo de datos [expresión constante];

"Tipo de datos": es el tipo de datos de los elementos de la matriz.
"Nombre de la matriz": siga las reglas del identificador del lenguaje C.
"Expresión constante": Indica cuántos elementos hay en el arreglo, es decir, la longitud del arreglo. Puede ser una constante entera, una expresión constante entera o una constante simbólica.

int a[5];

Se define una matriz unidimensional a, int significa que cada elemento en a en la matriz es un número entero, el nombre de la matriz es a, y esta matriz tiene 5 elementos. El subíndice de la matriz comienza desde 0, por lo que los 6 elementos de la matriz definida anteriormente son a[0], a[1], a[2], a[3], a[4], que se almacenan continuamente en la memoria, y el arreglo La primera dirección del arreglo es la dirección de a[0], y el nombre del arreglo representa la primera dirección del arreglo (la dirección es muy importante y se usará en el puntero), es decir, el valor de a y el valor de dirección de a[0] (&a[0] ) Igual.

Referencia de matriz 1D

Forma de referencia:
nombre de matriz [expresión de subíndice];

Entre ellos, "expresión de subíndice": solo puede ser una constante entera o una expresión entera.
Nota : el subíndice comienza en 0 (el límite inferior es 0) y el subíndice máximo (límite superior) de la matriz es la longitud de la matriz menos 1.

	int a[10];
	a[0]=0;
	scanf("%d",&a[10]);/*下标越界*/

La tercera línea del código anterior se usa incorrectamente, el subíndice de la matriz solo puede alcanzar (n-1) dígitos y n es el número de elementos de la matriz.

Inicialización de matriz unidimensional

1. Al definir una matriz. Inicializar todos los elementos de la matriz

int a[5]={
    
    0,1,2,3,4};

El valor de a[0] es 0, el valor de a[1] es 1,..., el valor de a[4] es 4.
Al asignar valores iniciales a todos los elementos del arreglo, la longitud del arreglo se puede especificar de forma diferente, como por ejemplo:

int a[]={
    
    0,1,2,3,4};

El sistema define la longitud de la matriz como 5 según el número de valores iniciales.
2. Al definir una matriz, asigne valores iniciales a algunos elementos de la matriz

int a[5]={
    
    0,1,2};

El valor de a[0] es 0, el valor de a[1] es 1, el valor de a[2] es 2 y el resto de los elementos son 0.

Matriz bidimensional

Definición de matriz bidimensional

Forma de definición:
nombre de matriz de tipo de datos [expresión constante 1] [expresión constante 2];

[Expresión constante 1] indica el número de filas de la matriz bidimensional y [Expresión constante 2] indica el número de columnas de la matriz bidimensional.

float x[2][3];

Defina x como una matriz de 2 filas y 3 columnas, con un total de seis elementos, y cada elemento es de tipo flotante. El sistema asigna un espacio de almacenamiento continuo en la memoria para la matriz bidimensional y el orden de disposición de los elementos se almacena en filas, es decir, x[0][0], x[0][1], x[ 0][2] , x[1][0], x[1][1], x[1][2]. El nombre de la matriz representa la primera dirección de la matriz.
Una matriz bidimensional puede verse como un tipo especial de matriz unidimensional, y la matriz x puede considerarse como una matriz unidimensional que contiene dos elementos grandes, y cada elemento es una matriz unidimensional que contiene tres elementos.
x[0]------x[0][0], x[0][1], x[0][2]
x[1]------x[1][0] , x[1][1], x[1][2]
x[0] es la primera dirección de la primera línea de la matriz bidimensional, es decir, la dirección de x[0][0], y x[1] es la matriz bidimensional La primera dirección de la segunda fila, es decir, la dirección de x[1][0].

referencia a una matriz bidimensional

Forma de referencia:
nombre de matriz [expresión de subíndice de fila] [expresión de subíndice de columna]
Nota : los subíndices de fila y columna de una matriz bidimensional comienzan desde 0 (el límite inferior es 0)

int a[3][4];
a[0][0]=3;
a[0][1]=a[0][0]+10;	

Referencia del error:

a[3][4]=3;/*下标越界*/
a[1,2]=1;/*应写成a[1][2]=1;*/

Inicialización de matriz bidimensional

1. Asignar valor inicial por fila:

int a[2][3]={
    
    {
    
    1,2,3},{
    
    4,5,6}};

Resultado de la inicialización:
primera línea: 1 2 3
segunda línea: 4 5 6
2. Asigne valores iniciales a cada elemento en el orden en que los elementos de la matriz están dispuestos en la memoria:

int a[2][3]={
    
    1,2,3,4,5,6};

Resultado de la inicialización:
primera línea: 1 2 3
segunda línea: 4 5 6
3. Asignar valores iniciales a algunos elementos:

int a[2][3]={
    
    {
    
    1},{
    
    4}};

Resultado de la inicialización:
primera línea: 1 0 0
segunda línea: 4 0 0

Nota especial: matrices de caracteres

Al igual que las matrices de enteros anteriores y las matrices reales, las matrices de caracteres también son un tipo de matriz. Entonces, ¿por qué la matriz de caracteres debe generarse por separado? Es diferente de otros tipos de arreglos, si es un arreglo entero, almacena datos enteros, si es un arreglo real, almacena datos reales. Pero las matrices de caracteres pueden almacenar tanto datos de caracteres como cadenas, y las cadenas solo se pueden almacenar en matrices de caracteres , que es su característica especial.

cadena

Para averiguar si los datos de caracteres almacenados en la matriz de caracteres siguen siendo una cadena, lo primero que debe averiguar es la diferencia entre un carácter y una cadena. La diferencia entre un carácter y una cadena es si hay una marca de fin de cadena ('\0'). Si hay un indicador de fin de cadena, es una cadena; de lo contrario, es un carácter.

char a[5]={
    
    'C','h', 'i', 'n', 'a' };
char b[6]={
    
    'C','h', 'i', 'n', 'a' , '\0'};

Como se muestra en las dos líneas de código anteriores, no hay una marca de fin de cadena ('\0') en la matriz, por lo que los caracteres almacenados en la matriz son 'C', 'h', 'i', 'n ', 'a' y '\0' están contenidos en la matriz b, y la cadena China se almacena en la matriz b.

Inicialización de matrices de caracteres

1. Usa constantes de caracteres para asignar valores iniciales

char a[5]={
    
    'C','h', 'i', 'n', 'a' };

La matriz a almacena datos de 5 caracteres, no cadenas, y cada elemento de la matriz y subíndice corresponden a una matriz de enteros.

char b[6]={
    
    'C','h', 'i', 'n', 'a' , '\0'};

Debido a que b[5]='\0' en la matriz b, las cadenas se almacenan en la matriz b.

2. Asigne el valor inicial con una constante de cadena

char str[10]= {
    
    "a string"};
char str[10]= "a string";

Las dos líneas de código anteriores tienen la misma función y ambas almacenan una cadena (una cadena) en la matriz str.

char a[3][10]={
    
    "basic","pascal","c"};

La matriz a tiene tres filas, y cada fila almacena una cadena.
Esto también muestra que si la longitud de la matriz es mayor que la longitud del contenido asignado, el sistema completará automáticamente '\0' en la posición restante y el contenido almacenado en la matriz se convertirá en una cadena. como:

char s3[7]={
    
     's', 't', 'r', 'i', 'n', 'g'};

La longitud de la matriz de caracteres es de 7 dígitos, pero el usuario solo asigna 6 dígitos al asignar un valor, entonces el sistema automáticamente llenará el séptimo dígito con '\0', es decir, s3[7]='\0'

3. Omisión de longitud durante la inicialización

char s1[ ]= "Good morning!";

En este momento, la longitud de la matriz s1 es 14 y s1[13]='\0'. Una cadena se almacena en la matriz s1.

char s2[ ]={
    
     's', 't', 'r', 'i', 'n', 'g'};

En este momento, la longitud de la matriz s2 es 6. No hay marcador de final de cadena en la matriz. Por lo tanto, no se puede utilizar como una cadena.

referencia a la matriz de caracteres

Las referencias a matrices de caracteres se pueden dividir en referencias a elementos individuales de la matriz de caracteres y referencias a toda la matriz de caracteres. Las referencias a elementos individuales de matrices de caracteres son las mismas que para matrices enteras y reales. La referencia general a la matriz de caracteres se manifiesta principalmente en la entrada y la salida.

char c[ ]= "China";
printf("%s",c);

Donde c es el nombre de la matriz, que representa la primera dirección de la matriz. La salida es China.

char c[10];
scanf("%s",c)

Si la entrada es Beijing, la cadena "Beijing" se almacena en la matriz.

resumen de matriz

Una matriz es una colección que representa un conjunto de datos del mismo tipo y se utiliza cuando se requieren muchas variables del mismo tipo. Se divide en arreglos unidimensionales y arreglos multidimensionales.
Lo primero que debe tener en cuenta es que el subíndice de la matriz no puede cruzar el límite. El subíndice de la matriz comienza desde 0, y el subíndice no puede cruzar el límite al definir o citar. Este es un error que se comete a menudo.
El segundo punto es la dirección de la matriz, la dirección es muy importante en la referencia del puntero posterior, es necesario aclarar que el nombre de la matriz representa la primera dirección de la matriz y cuál es la primera dirección de cada fila de los dos. matriz dimensional. La forma en que se asignan las direcciones de los elementos de la matriz en la computadora es útil para el aprendizaje posterior de los punteros.

tipo de estructura

El tipo de matriz es muy conveniente y flexible para el procesamiento de datos a gran escala, pero también tiene ciertas restricciones, es decir, los elementos de la misma matriz deben ser todos del mismo tipo de datos. ¿Hay algún tipo de datos que pueda reunir varios tipos de datos? Luego están las estructuras y los sindicatos.
Una estructura se compone de varios elementos de datos, y cada elemento de datos que forma una estructura se denomina miembro de estructura. Los tipos de datos de cada miembro de la estructura pueden ser diferentes. Antes de utilizar datos de tipo de estructura, primero se debe definir el tipo de estructura. La forma general de una definición de estructura:

struct 结构体名
{
    
    数据类型1 成员名1;
 数据类型2 成员名2...
 数据类型n 成员名n;
};

Entre ellos, struct es una palabra clave del lenguaje C, que indica la definición del tipo de estructura. El punto y coma final marca el final de la definición del tipo de estructura. Los miembros de la estructura pueden ser de cualquier tipo de datos permitido por el lenguaje C. Por ejemplo:

struct bookcard
{
    
    char num[10];
 char mane[30];
 char author[30];
 char publisher[60];
 float price;
 int n;
};

Nota: La definición del tipo de estructura solo muestra la composición del tipo, el sistema no le asigna espacio de memoria y el sistema de compilación solo asigna espacio de memoria para las variables, por lo que el espacio ocupado por la estructura es igual al espacio ocupado por cada miembro de la estructura y . El tipo de un miembro de estructura también puede ser otro tipo de estructura.

Definición de variable de tipo de estructura

1. Usar el tipo de estructura definido para definir variables
Este método debe usarse cuando múltiples funciones en un programa necesitan definir variables del mismo tipo de estructura, y el tipo de estructura debe definirse como un tipo global, en forma de nombre de estructura
struct variable Famoso reloj;

struct student
{
    
    char num[8];name[20];sex;
 int age;
 float score;
};
void main()
{
    
    struct student a;
...
}
f1()
{
    
    struct student b;
...
}

Dado que el tipo de estudiante de estructura se define fuera de la función, es una variable global, por lo que se puede usar para definir las variables de estructura a y b en la función principal y en la función f1.
2. Defina variables mientras define el tipo de estructura.
Este método generalmente se usa para definir variables externas, y este nombre de tipo de estructura también se puede usar para definir variables locales en cada función. La forma es:
struct estructura nombre
{tabla de definición de miembro;
}tabla de nombre de variable;

struct student
{
    
    char num[8];name[20];sex;
 int age;
 float score;
}st[30];
void main()
{
    
    struct student s;
...
}
f1()
{
    
    struct student x;
...
}

Una sola variable de tipo struct estudiante solo puede describir la información de un estudiante, y si es necesario guardar la información de 30 estudiantes, se puede definir una matriz de tipo estructura. Como se muestra arriba, una matriz de estructura externa se define al definir el nombre de tipo global, y el método de definición es el mismo que otros tipos de definiciones de matriz. Cada elemento de esta matriz es una variable de tipo estructura. El uso combinado de estos dos tipos de construcciones lo hace más general para el procesamiento de datos.

3. Definir directamente la variable de tipo de estructura
Este método se puede usar cuando solo hay un lugar en el programa que necesita una determinada variable de tipo de estructura. En este método, el nombre del tipo de estructura no se especifica y la forma es:
struct
{tabla de definición de miembro;
}tabla de nombre de variable;

void main()
{
    
    struct
 {
    
    char num[8],name[30],sex;
  int age;
  float score;
 }st[30],a,b,c;
 int i,j;
 ...
}

Inicialización de variables de estructura

Al definir una variable de estructura, también puede asignar valores iniciales a sus miembros. La tabla de valores iniciales está delimitada por "{}", y los datos de la tabla están separados por comas, y el número de miembros debe ser el mismo que el de la definición del tipo de estructura, y el tipo debe ser el mismo. Si el número de valores iniciales es menor que el número de miembros de la estructura, a los miembros sin valores iniciales se les asigna un valor de 0. Si el número de valores iniciales supera el número de miembros de la estructura, se produce un error de compilación.
Ejemplo: Inicialización de variable de estructura:

struct date
{
    
    int year,month,day;};
struct student
{
    
    char num[8],name[30],sex;
 struct date birthday;
 float score;
}a={
    
    "40826011","Li ming","M",{
    
    1991,2,9},87.5},
 b={
    
    "40826025","Zhang qiang","F",{
    
    1990,5,12},85},c,d;

Inicialización de una matriz de estructuras:

struct s
{
    
    char num[8],name[30],sex;
 float score;
}stu[3]={
    
    
		{
    
    "40826011","Li ming","M",87.5},
		{
    
    "40826025","Zhang qiang","F",85},
		{
    
    "40826032","Wang xinping","F",90}
		};

Formas de referencia de miembros variables de estructura

La forma general de hacer referencia a miembros de variables de estructura es:
nombre de variable de estructura nombre de miembro
donde "." es un operador de componente con el nivel más alto de operación. Por ejemplo, en el primer fragmento de código en la inicialización de la variable de estructura, los miembros de a se pueden expresar como a.num, a.name, a.sex, a.birthday y a.score. a, b, c y d son variables del mismo tipo, y a.num, b.num, c.num y d.num se pueden utilizar para distinguir los miembros respectivos del mismo nombre num.
Puntero de estructura: struct estudiante *p;
Por ejemplo:

struct code
{
    
    int n;
 char c;
}a,*p=&a;

p es un puntero de estructura que apunta a a, y hay tres formas de referirse a los miembros de la variable a:
1.an, ac seleccionar miembros por operación de componente de nombres de variables,
2.(*p).n,(*p) .c: use el operador de almacenamiento indirecto de la variable de puntero para acceder a la variable de destino;
3.p->n,p->c: esta es una forma especialmente utilizada para las variables de puntero de estructura para referirse a los miembros de la estructura, que es equivalente a la segunda formulario

Tipo de unión

Una unión es similar a un tipo de construcción que comparte estructuras de almacenamiento de diferentes tipos de datos, es decir, todos los miembros de una variable de unión ocuparán el mismo espacio de almacenamiento. Esto también muestra que el espacio ocupado por el sindicato es igual al espacio máximo ocupado por sus miembros . La ventaja de usar este tipo de datos es ahorrar espacio de almacenamiento.
La forma general de una definición de tipo de unión es:

union 共用体名
{
    
    数据类型1 成员名1;
 数据类型2 成员名2...
 数据类型n 成员名n;
 }

Entre ellos, union es una palabra clave del lenguaje C, que indica la definición del tipo de unión. El último punto y coma marca el final de la definición del tipo de unión. Los miembros de la unión pueden ser cualquier tipo de datos permitido por el lenguaje C. Por ejemplo:

union utype
{
    
    int i;
 char ch;
 long l;
 char c[4];
};

Definición de una variable de unión

La forma de definición de la variable de tipo unión es similar a la definición de variable de estructura.
1. unión nombre del cuerpo de la unión tabla de nombres de variables
2. unión nombre del cuerpo de la unión
{tabla de definición de miembros;
} tabla de nombres de variables;

3. unión
{tabla de definiciones de miembros;
} tabla de nombres de variables;

Referencias a miembros de variables de unión

Al igual que con el tipo de variable de estructura, también hay 3 formas de referencias a miembros del sindicato

union u
{
    
    char u1;
 int u2;
}x,*p=&x;

La forma de referencia es:
1.x.u1,x.u2,
2.(*p).u1,(*p).u2,
3.p->u1,p->u2;

Supongo que te gusta

Origin blog.csdn.net/Tao_9/article/details/129711370
Recomendado
Clasificación