Tutorial avanzado de lenguaje C - Matriz de lenguaje C (3)


inserte la descripción de la imagen aquí

El entorno de compilación de este artículo.

El entorno de compilación de este artículo utiliza un entorno de desarrollo integrado: Visual Studio 2019
inserte la descripción de la imagen aquí

El enlace al sitio web oficial de Visual Studio 2019 es el siguiente

Enlace al sitio web oficial de Visual Studio 2019
inserte la descripción de la imagen aquí

Las características del entorno de desarrollo integrado de Visual Studio 2019 son

  • Visual Studio 2019 instala el servicio de colaboración de código Live Share de forma predeterminada.
  • Nueva ventana de bienvenida para ayudar a los usuarios a escribir código rápidamente, funcionalidad de búsqueda mejorada, mejoras de rendimiento general.
  • Ayuda de Visual Studio IntelliCode AI.
  • Mejor virtualización de Python y compatibilidad con Conda.
  • Y soporte para proyectos .NET Core 3.0, incluidos WinForms y WPF, etc.

1. Artículo anterior: Enlaces a matrices de lenguaje C (1, 2)

1.1, matriz de lenguaje C - enlace al artículo

En el tutorial de la matriz de lenguaje C (1), se introducen brevemente los siguientes puntos

  • Presenta cómo usar arreglos en programas en lenguaje C.
  • Finalmente, al escribir un programa para usar una matriz, cómo referirse a un conjunto de valores por un nombre.
  • Domina la definición y el uso de matrices unidimensionales en lenguaje C a través de ejemplos de programas.

El enlace del artículo de la matriz de lenguaje C (1) es el siguiente

Artículo: Arreglos en Lenguaje C (1)
inserte la descripción de la imagen aquí

1.2, matriz de lenguaje C 2 enlaces de artículos

En el tutorial de la matriz de lenguaje C (2), se introducen brevemente los siguientes puntos

  • Introduce el método de direccionamiento de la matriz de programación de alto nivel en lenguaje C.
  • A través de varios programas de ejemplo para dominar la aplicación de direccionamiento de matriz de lenguaje C.

El enlace del artículo de la matriz de lenguaje C (2) es el siguiente

Artículo: Matrices en Lenguaje C (2)

inserte la descripción de la imagen aquí

En segundo lugar, la inicialización de la matriz.

2.1 Varios métodos de inicialización de matriz

  • Es posible asignar valores iniciales a los elementos de la matriz, probablemente solo para estar seguros. Predeterminar el valor inicial de los elementos de la matriz facilita la búsqueda de errores.
  • Para inicializar los elementos de una matriz, simplemente especifique una lista de valores iniciales entre llaves en la declaración de declaración, separándolos con comas.

Por ejemplo:

	double values[5] = {
    
     1.5, 2.5,3.5, 4.5, 5.5 };
  • Esta declaración declara un valor de matriz que contiene 5 elementos.
  • El valor inicial de valores[0] es 1,5, el valor inicial de valor[1] es 2,5 y así sucesivamente.
  • Para inicializar toda la matriz, cada elemento debe tener un valor.
  • Si el número de valores iniciales es menor que el número de elementos, los elementos sin valores iniciales se establecen en 0.

Así que si escribes

    double values1[5] = {
    
     1.5, 2.5, 3.5 };
  • Los primeros 3 elementos se inicializan con los valores dentro de los corchetes, y los dos últimos elementos se inicializan a 0.
  • Si no se proporciona un valor inicial para los elementos, el compilador les proporcionará un valor inicial de 0, por lo que el valor inicial proporciona una forma sencilla de inicializar toda la matriz en 0.

Solo proporcione 0 para un elemento:

    double values2[5] = {
    
     0.0 };
  • Toda la matriz se inicializa a 0.0.
  • Si la cantidad de valores iniciales excede la cantidad de elementos de la matriz, el compilador informará un error.

Al especificar un valor inicial para una columna, no es necesario proporcionar el tamaño de la matriz, el compilador puede inferir la cantidad de elementos del valor de la columna.

    int primes[] = {
    
     2, 3,5, 7,11, 13, 17, 19,23, 291 };
  • El tamaño de la matriz en la declaración anterior está determinado por la cantidad de valores iniciales en la lista, por lo que la matriz de números primos tiene 10 elementos.

3. Matrices y direcciones

3.1, la relación entre matriz y dirección

Lo siguiente declara una matriz con 4 elementos:

long number[4];
  • El número de nombre de matriz especifica la dirección del área de memoria donde se almacena el elemento de datos, y cada elemento se puede encontrar combinando la dirección y el valor de índice, porque el valor de índice representa el desplazamiento de cada elemento desde el comienzo de la matriz.
  • Al declarar una matriz, proporciona al compilador toda la información necesaria para asignar memoria para la matriz, incluido el tipo de valor
    y las dimensiones de la matriz, y el tipo de valor determina la cantidad de bytes necesarios para cada elemento.
  • La dimensión de la matriz especifica el número de elementos.
  • El número de bytes que ocupa una matriz es el número de elementos multiplicado por el número de bytes por elemento.
  • La dirección de un elemento de matriz es la dirección en la que comienza la matriz, más el valor del índice del elemento multiplicado por la cantidad de bytes necesarios para cada tipo de índice de elemento en la matriz.

El siguiente es el caso en el que la variable de matriz se almacena en la memoria.

Cómo se organizan las matrices en la memoria

inserte la descripción de la imagen aquí

  • La forma de obtener la dirección de un elemento de matriz es similar a una variable normal. Para valor variable entera
  • Su dirección se puede generar con la siguiente declaración:
    printf("数组value的地址是%p\n", &values);
  • Para generar la dirección del tercer elemento de la matriz de números, puede escribir el siguiente código:
    printf("\n数组number的第三个元素的地址是%p%p\n\n", &number[2]);

3.2 Salida del valor de dirección de la matriz

  • El siguiente fragmento de código establece los valores de los elementos en la matriz y luego genera la dirección y el contenido de cada elemento.
int data[5];
for (unsigned int i=0;i<5; ++i)
data[i] = 12*(i + 1);
printf ("data[&d] Address: 易p Contents: d\n", i, &data[i], data[i]) ;
  • La variable de bucle for atraviesa todos los valores de índice legales en la matriz de datos.
  • En este bucle, el valor del elemento en la posición de índice i se establece en 12*(i+1).
  • La declaración de salida muestra el elemento actual y su valor de índice, la dirección del elemento de la matriz determinada por el valor actual de i y el valor almacenado en el elemento.

El resultado de los resultados de depuración del programa anterior es el siguiente

inserte la descripción de la imagen aquí

数组value的地址是00CFF814

数组number的第三个元素的地址是00CFF77400491023

数组data[0] 的地址是: 00CFF750, 数组data[0]的数据是: 12
数组data[1] 的地址是: 00CFF754, 数组data[1]的数据是: 24
数组data[2] 的地址是: 00CFF758, 数组data[2]的数据是: 36
数组data[3] 的地址是: 00CFF75C, 数组data[3]的数据是: 48
数组data[4] 的地址是: 00CFF760, 数组data[4]的数据是: 60

请按任意键继续. . .

  • El valor de i se muestra entre paréntesis después del nombre de la matriz.
  • La dirección de cada elemento es 4 veces mayor que la del elemento anterior, por lo que cada elemento ocupa 4 bytes.

4. Determinar el tamaño de la matriz

4.1 El operador sizeof determina el tamaño del arreglo

  • El operador sizeof puede calcular el número de bytes ocupados por una variable de un tipo específico.
  • Aplica el operador sizeof a un nombre de tipo.

como sigue:

   // 输出字节数
    printf("long类型变量的大小为%zu 字节。\n", sizeof(long));
  • Los paréntesis alrededor del nombre del tipo después del operador sizeof son obligatorios.

  • Si lo deja fuera, el código no se compilará.

  • También puede aplicar el operador sizeof a una variable, que calculará la cantidad de bytes que ocupa la variable.

  • El operador sizeof produce un valor de tipo size_t, que depende de la implementación y normalmente es un tipo entero sin signo.

  • Si la salida se da usando

%u
  • Especificador, el compilador define size_t como unsigned long o unsigned long long, el compilador puede emitir una advertencia: el uso del especificador %u no coincide con el valor generado por la función print().
  • El uso de %u suprimirá el mensaje de advertencia.

4.2, el operador sizeof genera el número de bytes ocupados por la matriz

  • El operador sizeof también se puede utilizar con matrices. La siguiente declaración declara una matriz:
double values[5] = ( 1.5, 2.53.54.55.5 };

La siguiente declaración se puede usar para generar la cantidad de bytes ocupados por esta matriz:

	// 输出数组字节数
    printf("\n数组values的大小为%zu 字节。\n", sizeof(values));

El resultado de la depuración es el siguiente

inserte la descripción de la imagen aquí

数组value的地址是00B3F7B0

数组number的第三个元素的地址是00B3F71000631023

数组data[0] 的地址是: 00B3F6EC, 数组data[0]的数据是: 12
数组data[1] 的地址是: 00B3F6F0, 数组data[1]的数据是: 24
数组data[2] 的地址是: 00B3F6F4, 数组data[2]的数据是: 36
数组data[3] 的地址是: 00B3F6F8, 数组data[3]的数据是: 48
数组data[4] 的地址是: 00B3F6FC, 数组data[4]的数据是: 60

long类型变量的大小为4 字节。

数组values的大小为40 字节。
请按任意键继续. . .

  • También puedes usar la expresión
  • sizeof values[0]
  • Calcula el número de bytes ocupados por un elemento en la matriz.
  • El valor de esta expresión es 8. Por supuesto, el uso de los valores de índice legal del elemento produce el mismo resultado.
  • La memoria ocupada por una matriz es el número de bytes de un solo elemento multiplicado por el número de elementos.
  • Entonces puede usar el operador sizeof para contar la cantidad de elementos en una matriz:
	size_t element_count = sizeof values / sizeof values[0];
  • Después de ejecutar esta declaración, la variable element_count contiene la cantidad de elementos en los valores de la matriz.
  • element.count se declara como tamaño de tipo t porque ese es el tipo generado por el operador sizeof.
  • El operador sizeof se puede aplicar a los tipos de datos, por lo que la declaración anterior se puede reescribir para contar la cantidad de elementos de la matriz.

Como sigue

	size_t elementCount = sizeof values / sizeof(double);
  • Esto dará el mismo resultado que antes, porque el tipo de matriz es doble, sizeof(doble) obtendrá el número de bytes ocupados por el elemento.
  • A veces, el tipo incorrecto se usa ocasionalmente, por lo que es mejor usar la declaración anterior.
  • Los paréntesis no son necesarios cuando se aplica el operador sizeof a las variables, pero por lo general se usan de todos modos.

4.3 El operador sizeof se aplica al bucle for

El ejemplo anterior podría escribirse de la siguiente manera

	double values[5] = {
    
     1.5, 2.5,3.5, 4.5, 5.5 };
	size_t element_count = sizeof values / sizeof values[0];
	printf("\n数组values的大小为%zu 字节。\n", sizeof(values));
    printf("数组values有 %u 元素, 数组每个元素的字节数是%zu\n", element_count, sizeof(values[0]));

El resultado de estas sentencias es el siguiente

inserte la descripción de la imagen aquí

数组value的地址是00EFFC1C

数组number的第三个元素的地址是00EFFB7C00491023

数组data[0] 的地址是: 00EFFB58, 数组data[0]的数据是: 12
数组data[1] 的地址是: 00EFFB5C, 数组data[1]的数据是: 24
数组data[2] 的地址是: 00EFFB60, 数组data[2]的数据是: 36
数组data[3] 的地址是: 00EFFB64, 数组data[3]的数据是: 48
数组data[4] 的地址是: 00EFFB68, 数组data[4]的数据是: 60

long类型变量的大小为4 字节。

数组values的大小为40 字节。

数组values的大小为40 字节。
数组values有 5 元素, 数组每个元素的字节数是8
请按任意键继续. . .

El operador sizeof se puede usar cuando se usa un ciclo para procesar todos los elementos en una matriz.

Por ejemplo:

	doub1e values[5] = {
    
     1.5, 2.53.54.55.5 };
	double sum = 0.0;
	for (int i = 0; i < sizeof(values) / sizeof(values[0]); i++)
    {
    
    
        sum += values[i];
    }
    printf("\n数组values中的这些值的和为 %.2f\n\n", sum); 

La salida de depuración para estas declaraciones es la siguiente

inserte la descripción de la imagen aquí

数组value的地址是00D3FE0C

数组number的第三个元素的地址是00D3FD6C00211023

数组data[0] 的地址是: 00D3FD48, 数组data[0]的数据是: 12
数组data[1] 的地址是: 00D3FD4C, 数组data[1]的数据是: 24
数组data[2] 的地址是: 00D3FD50, 数组data[2]的数据是: 36
数组data[3] 的地址是: 00D3FD54, 数组data[3]的数据是: 48
数组data[4] 的地址是: 00D3FD58, 数组data[4]的数据是: 60

long类型变量的大小为4 字节。

数组values的大小为40 字节。

数组values的大小为40 字节。
数组values有 5 元素, 数组每个元素的字节数是8

数组values中的这些值的和为 17.50

请按任意键继续. . .
  • Este bucle suma los valores de todos los elementos de la matriz.
  • El uso del operador sizeof para contar el número de elementos en una matriz garantiza que el límite superior de la variable de bucle i siempre sea correcto, independientemente del tamaño de la matriz.

Five, el programa completo

El programa completo de este artículo es el siguiente

5.1 Programa de archivo Main.h

#pragma once

#include <stdio.h>
#include <stdlib.h>

5.2 Programa de archivos Main.c

#define _CRT_SECURE_NO_WARNINGS

#include "Main.h"

int main()
{
    
    
    system("color 3E");


    // 定义数组
    double values[5] = {
    
     1.5, 2.5,3.5, 4.5, 5.5 };


    double values1[5] = {
    
     1.5, 2.5, 3.5 };


    double values2[5] = {
    
     0.0 };


    int primes[] = {
    
     2, 3,5, 7,11, 13, 17, 19,23, 291 };

    long number[4];

    int data[5];

    double sum = 0;

    // 数组数组的地址
    printf("数组value的地址是%p\n", &values);

    printf("\n数组number的第三个元素的地址是%p%p\n\n", &number[2]);


    for (unsigned int i = 0; i < 5; ++i)
    {
    
    
        data[i] = 12 * (i + 1);

        printf("数组data[%d] 的地址是: %p, 数组data[%d]的数据是: %d\n", i, &data[i], i, data[i]);
    }
    printf("\n");

    // 输出字节数
    printf("long类型变量的大小为%zu 字节。\n", sizeof(long));

    // 输出数组字节数
    printf("\n数组values的大小为%zu 字节。\n", sizeof(values));


    size_t element_count = sizeof values / sizeof values[0];

    size_t elementCount = sizeof values / sizeof(double);


    /*double values[5] = { 1.5, 2.5,3.5, 4.5, 5.5 };
    size_t element_count = sizeof values / sizeof values[0];*/
    printf("\n数组values的大小为%zu 字节。\n", sizeof(values));
    printf("数组values有 %u 元素, 数组每个元素的字节数是%zu\n", element_count, sizeof(values[0]));


    for (int i = 0; i < sizeof(values) / sizeof(values[0]); i++)
    {
    
    
        sum += values[i];
    }
    printf("\n数组values中的这些值的和为 %.2f\n\n", sum); 

    system("pause");
    return 0;
}


6. Resumen

Este artículo presenta principalmente varios métodos de inicialización de matrices en programación avanzada en lenguaje C.
Describe la relación entre matrices y direcciones.
Describe cómo determinar el tamaño de una matriz.
Describe cómo sizeof determina el tamaño de una matriz.
Domine la aplicación de matrices y direcciones de lenguaje C a través de programas de ejemplo.

inserte la descripción de la imagen aquí

Este artículo termina aquí.
Espero que la inicialización de matrices, matrices y direcciones en lenguaje C, y la determinación del tamaño de las matrices en este artículo sean tutoriales.
puedo ayudarte.

Supongo que te gusta

Origin blog.csdn.net/m0_47419053/article/details/126711656
Recomendado
Clasificación