Lenguaje C: matriz (explicación detallada)

prefacio

Array (Array) es una secuencia ordenada de elementos. Si se nombra una colección de variables finitas del mismo tipo, entonces este nombre es un nombre de matriz. Las variables individuales que componen una matriz se denominan componentes de la matriz, también llamados elementos de la matriz y, a veces, variables de subíndice. Los números numéricos que se utilizan para distinguir los elementos individuales de una matriz se denominan subíndices. Array es una forma en la que varios elementos del mismo tipo se organizan de forma ordenada para facilitar su procesamiento en la programación. Estas colecciones ordenadas de elementos de datos similares se denominan matrices.

Por lo tanto, las matrices se utilizan para almacenar múltiplesUna colección de datos del mismo tipo.

Más información sobre matrices

nombre de matriz

en un;
intb[10];

Podemos estar seguros de que a es una variable entera, entonces b[10] es una matriz de tipos enteros y b significanombre de matriz, entonces, ¿cuál es el tipo del nombre de la matriz? En lenguaje C, el nombre de la matriz b es en realidad unpuntero constante, es decir, la dirección del primer elemento de la matriz, el tipo depende del tipo del elemento de la matriz; por supuesto, aquí, la matriz no se puede considerar como un puntero, la matriz tiene algunas características completamente diferentes del puntero, y la matriz se almacena continuamente en la memoria.Un puntero es solo un escalar. Entonces, el nombre de la matriz representa la dirección del primer elemento de la matriz, sin embargo, hay dos excepciones:tamaño de (nombre de la matriz)y tomar dirección& nombre de matriz, donde sizeof (nombre de matriz) representa la longitud en bytes de toda la matriz, no la longitud en bytes del puntero;

int b[10];
printf(“%d”,sizeof(b));
Resultado: 40
Explicación: En una matriz de enteros, un elemento representa 4 bytes y una matriz es 4*10=40 bytes

intb[10];
printf(“%p\n”,b);
printf(“%p\n”,&b);
imprimirf(“%p\n”,b+1);
printf(“%p\n”,&b+1);
结果:
000000000061FDF0
000000000061FDF0
000000000061FDF4
000000000061FE18

inserte la descripción de la imagen aquí

referencia de subíndice

En una matriz, podemos encontrar un elemento específico haciendo referencia al subíndice del elemento de la matriz. El lenguaje C estipula que los subíndices de los arreglos comienzan desde 0.
inserte la descripción de la imagen aquí
Por ejemplo, si queremos encontrar el quinto elemento, podemos referirnos directamente a b[4]. De hecho, en el lenguaje C, b[4] se llama por desreferenciación, es decir, *(b+4), y el lenguaje C usa [] para expresar, lo que hace que la expresión sea más concisa.
Mira el siguiente código:

#include <stdio.h>
int main()
{
    
    
 int arr[10] = {
    
    0};//数组的不完全初始化
    //计算数组的元素个数
    int sz = sizeof(arr)/sizeof(arr[0]);
 //对数组内容赋值,数组是使用下标来访问的,下标从0开始。所以:
 int i = 0;//做下标
 for(i=0; i<10; i++)
 {
    
    
 arr[i] = i;
 } 
 //输出数组的内容
 for(i=0; i<10; ++i)
 {
    
    
 printf("%d ", arr[i]);
 }
 return 0;
}

inserte la descripción de la imagen aquí
Esta es la siguiente referencia a la matriz.Podemos atravesar la matriz a través del bucle for y realizar una serie de operaciones como la asignación y la impresión.

uso de arreglos

creación de matriz

En pocas palabras, crear una matriz es agregar [] al nombre de la matriz, y las llaves deben dar un valor constante. Por ejemplo,
int arr1[10];
a ver,

int count = 10;
int arr2[count];

¿Es posible aquí?

Para la creación de matrices, antes del estándar C99, se debe proporcionar una constante entre [] y no se pueden usar variables. El estándar C99 admite el concepto de matrices de longitud variable. El tamaño de la matriz se puede especificar mediante variables, pero la matriz no se puede inicializar.

Inicialización de matriz

El significado de inicialización de matriz e inicialización de variable es el mismo, ambos para dar un valor inicial razonable.
como:

int arr1[10] = {
    
    1,2,3};
int arr2[] = {
    
    1,2,3,4};
int arr3[5] = {
    
    12345}char arr4[3] = {
    
    'a',98, 'c'};
char arr5[] = {
    
    'a','b','c'};
char arr6[] = "abcdef";

Se ha determinado en arr1 que el arreglo tiene 10 elementos, podemos usar {} para asignar valores al arreglo, pero podemos ver que aquí solo se asignan 3 elementos, según C, los no asignados por defecto son 0. Entonces, a los tres primeros Los primeros elementos se les asignan valores de 1, 2 y 3, y los otros son 0.
En arr2, [] no especifica el número especificado, pero en la posterior inicialización de llaves, 4 elementos son asignado, por lo que está predeterminado en arr2. Hay 4 elementos en , y los 4 elementos se asignan respectivamente.
En arr3, los valores se asignan desde el primer elemento hasta el último elemento.
arr4 es una matriz de caracteres, y descubrimos que al segundo elemento se le asigna un valor de 98, por lo que para los caracteres, este 98 representa el valor 98 en la tabla ASCLL, que es 'b'.
arr5 es equivalente a arr4
arr6 Descubrimos que se inicializa con una cadena de cadenas, lo cual es razonable para matrices de caracteres. Porque un elemento representa un carácter. Por lo tanto, para las siguientes dos matrices, en realidad son equivalentes.

char arr1[] = "abc";
char arr2[3] = {
    
    'a','b','c'};

Almacenamiento de arreglos en memoria

Como dijimos anteriormente, las matrices se almacenan de forma contigua en la memoria.Veamos el siguiente código:

#include <stdio.h>
int main()
{
    
    
 int arr[10] = {
    
    0};
 int i = 0;
    int sz = sizeof(arr)/sizeof(arr[0]);
    
 for(i=0; i<sz; ++i)
 {
    
    
 printf("&arr[%d] = %p\n", i, &arr[i]);
 }
 return 0;
}

inserte la descripción de la imagen aquí
La dirección de la matriz es de dirección baja a dirección alta y la diferencia entre direcciones adyacentes es 4, que es exactamente un byte entero. Así que ven aLas matrices se almacenan de forma contigua en la memoria.
inserte la descripción de la imagen aquí

Matriz bidimensional

Si un arreglo unidimensional es una línea, entonces un arreglo bidimensional es un plano.
Representación de una matriz bidimensional:

int arr[3][4];
char arr[3][5];
double arr[2][4];

Usemos la matriz bidimensional de enteros para ilustrar, arr es un vector que contiene 3 elementos, y cada elemento en sí mismo es un vector que contiene 5 elementos. En otras palabras, arr es una matriz unidimensional de matrices unidimensionales. Es decir, podemos considerar la constante en el primer [] como el número de filas y la constante en el segundo [] como el número de columnas para la representación.
inserte la descripción de la imagen aquí
Pero recuerde, esto es solo por conveniencia de comprensión para que el usuario lo vea, es una forma de camuflaje, lo mismo es cierto en matrices multidimensionales.

orden de almacenamiento

#include <stdio.h>
int main()
{
    
    
 int arr[3][4];
 int i = 0;
 for(i=0; i<3; i++)
 {
    
    
 int j = 0;
 for(j=0; j<4; j++)
 {
    
    
 printf("&arr[%d][%d] = %p\n", i, j,&arr[i][j]);
 }
 }
 return 0;
}

Resultado:
inserte la descripción de la imagen aquí
se puede ver que en una matriz bidimensional, la memoria del elemento de la matriz todavía se almacena de forma continua.
inserte la descripción de la imagen aquí

Inicialización de matriz bidimensional

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

Explicación: hay tres filas y cuatro columnas en la matriz arr. Durante la inicialización, solo se asigna e inicializa la primera fila, y las demás tienen un valor predeterminado de 0.
inserte la descripción de la imagen aquí

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

Explicación: hay varias llaves en arr, y en la segunda capa de llaves, significa inicializar un elemento del número de fila.
inserte la descripción de la imagen aquí

int arr[][4] = { {2,3},{4,5}};

Explicación: si se inicializa la matriz bidimensional, se puede omitir la fila, pero no se puede omitir la columna.

referencia de subíndice

Las referencias de subíndices de matrices bidimensionales son las mismas que las matrices unidimensionales.
Mira el siguiente código:

#include <stdio.h>
int main()
{
    
    
 int arr[3][4] = {
    
    0};
 int i = 0;
 for(i=0; i<3; i++)
 {
    
    
 int j = 0;
 for(j=0; j<4; j++)
 	{
    
    
	 arr[i][j] = i*4+j;
 	}
 }
 for(i=0; i<3; i++)
 {
    
    
 int j = 0;
 for(j=0; j<4; j++)
 {
    
    
 printf("%d ", arr[i][j]);
 }
 printf("\n");
 }
 return 0;
}

Resultado:
inserte la descripción de la imagen aquí
Explicación: La matriz bidimensional comienza desde el subíndice 0 0 hasta el subíndice 3 3 del último elemento. Use dos bucles for para recorrer anidadamente para obtener el resultado.

nombre de matriz

El nombre de la matriz de la matriz bidimensional apunta a la primera fila y +1 apunta a la segunda fila;
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

Matriz fuera de los límites

Cuando hemos construido una matriz y la inicializamos, significa que suLa memoria espacial ya está determinadaPor supuesto, al acceder, siCuando la referencia del subíndice excede el alcance, es un acceso fuera de los límitesarriba. El lenguaje C en sí mismo no realiza comprobaciones fuera de los límites de los subíndices de matriz, y es posible que el compilador no informe necesariamente un error, pero si el compilador no informa un error, no significa que el programa sea correcto, por lo que los programadores deben comprobar al escribir código.
como:

#include <stdio.h>
int main()
{
    
    
 int arr[10] = {
    
    1,2,3,4,5,6,7,8,9,10};
    int i = 0;
    for(i=0; i<=10; i++)
   {
    
    
        printf("%d\n", arr[i]);//当i等于10的时候,越界访问了
   }
 return 0;
}

inserte la descripción de la imagen aquí
El último número aquí es un número aleatorio.
inserte la descripción de la imagen aquí

matriz como parámetro de función

De lo anterior sabemos queEl nombre de la matriz es un puntero., cuando el nombre de la matriz se pasa como parámetro a una función, en realidad esSe pasa la dirección del primer elemento.En el pasado, el acceso a los datos se realizaba dentro de la función realizando una operación de direccionamiento indirecto en ese puntero. Dado que la matriz se almacena continuamente en la memoria, cuando el parámetro formal de la matriz se llama en la función, la matriz se puede llamar de la misma manera que la función principal. Sin embargo, solo porque el nombre de la matriz es un puntero, cuando se usa sizeof para calcular el tamaño de la matriz en la función, a menudo se producen errores, porque la dirección del primer elemento se llama en este momento. Así que la solución es a menudoAl usar una matriz como parámetro, se traerá una variable del número de elementos de la matriz.
Por ejemplo: al llamar a la función de clasificación de burbujas, el número se calculará primero en la función donde se encuentra la matriz y luego se pasarán los parámetros.
inserte la descripción de la imagen aquí

void bubble_sort(int arr[], int sz)//参数接收数组元素个数
{
    
    
  int i = 0;
 for(i=0; i<sz-1; i++)
   {
    
    
        int j = 0;
        for(j=0; j<sz-i-1; j++)
       {
    
    
            if(arr[j] > arr[j+1])
           {
    
    
                int tmp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = tmp;
           }
       }
   }
}
int main()
{
    
    
    int arr[] = {
    
    3,1,7,5,8,9,0,2,4,6};
    int sz = sizeof(arr)/sizeof(arr[0]);//先计算好个数
    bubble_sort(arr, sz);
    for(i=0; i<sz; i++)
   {
    
    
        printf("%d ", arr[i]);
   }
    return 0;
}

Resultado: 0 1 2 3 4 5 6 7 8 9

fin

Bueno, el artículo termina aquí. Aquí hay algunas introducciones simples a las matrices, espero que le sean útiles.
inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/m0_74068921/article/details/130764172
Recomendado
Clasificación