Acceder a una matriz bidimensional con un puntero

Prefacio
¿Cómo entender una matriz bidimensional? Entendemos una matriz bidimensional de forma bidimensional, pero es unidimensional cuando se almacena.

Use un puntero para acceder a una matriz de dos dígitos
Ejemplo: int a[3] [4] = {1,3,5,7,9,11,13,15,17,19,21,23};

a[0] [0] a[0] [1] a[0] [2] a[0] [3] a[1] [0] a[1] [1] a[1 ] [2]
a [1] [3] a[2] [0] a[2] [1] a[2] [2] a[2] [3] El método de almacenamiento de nuestra matriz bidimensional
imaginada: 3 filas y 4 columnas

a[0] [0]
a[0] [1]
a[0] [2]
a[0] [3]
a[1] [0]
a[1] [1]
a[1] [2]
a [1] [3]
a[2] [0]
a[2] [1]
a[2] [2]
a[2] [3]
Creemos que los primeros cuatro son un nombre de matriz con a[0] Uno matriz de bits con cuatro elementos int

Los cuatro del medio son arreglos unidimensionales llamados a[1]

Los últimos cuatro son arreglos unidimensionales llamados a[2]

 

 

 Diferentes formas de acceder a arreglos bidimensionales a través de punteros

 

 

*a y a son dos conceptos completamente diferentes:

a trata esta matriz como una matriz unidimensional y agrega uno a la siguiente matriz unidimensional, es decir, a+1

*a apunta a un arreglo unidimensional donde cada elemento es un número entero, por lo que se considera que *a+0 apunta a un número entero, y sumando uno es el siguiente número entero

 

¿Por qué no puedes usar *p=a?

int x,*p;
double y,*q;
p=&x;
q=&y;
p=q;//是错的
//p是指向四个字节为存储单元的地址
//q是指向八个字节为存储单元的地址
//两者不可以等价

 

Cuatro formas de acceder a elementos de matriz bidimensionales:

1. Acceda a los elementos de la matriz por subíndice

int a[3][4];
for (int i=0; i<3; i++)
    for (int j=0; j<4; j++)
        a[i][j] = i+j;

2. Acceda a los elementos de la matriz a través de la primera dirección de la matriz.
Para un elemento de matriz bidimensional a[i] [j], “[]” es en realidad un operador de indexación, que convierte la dirección de almacenamiento del elemento a[i] [j] en a[i] + j.

3. Acceda a los elementos de la matriz a través de punteros ("ver" una matriz bidimensional desde la perspectiva de una matriz unidimensional)

int a[3][4];
int *p=&a[0][0];
for (int i=0; i<3; i++)
    for(int j=0; j<4; j++)
        *(p++) = i+j;        //相当于*p=i+j;p++;


Aquí, el puntero p se define como: "puntero a int", es decir: el puntero p "piensa" que apunta a un arreglo unidimensional, cada elemento es de tipo int, y hay 12 elementos en total .

4. Acceda a la matriz a través de un puntero ("ver" la matriz desde la perspectiva de una matriz bidimensional)

int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
int (*p)[4];        
/*
对p指针的理解:
*p声明了p的指针。
p是指向什么的指针呢?
指向了一个包含了4个整数的一维数组
*/
p=a;
for(int i=0; i<3;i++)
    for (int j=0;j < 4;j++)
        *(*(p+i)+j)=i+j;

Después de definir el puntero de esta manera, el puntero == p mirará la matriz bidimensional exactamente con la misma "perspectiva" que la matriz a. ==Es decir, como se puede usar a, p también se puede usar de la misma manera

//Por ejemplo: aquí *(*(p+i)+j) se reemplaza por p[i][j], a[i][j], *(*(a+i)+j) son todos equivalentes 1 apunta a una matriz bidimensional de cadenas char *str[3]={"Red","Green","Blue"};//La prioridad de los corchetes es mayor que la de "*"//
Significa str Es una matriz con tres elementos, que almacena punteros a caracteres


 


Ejemplo: Los puntajes de 3 estudiantes y 4 tareas se almacenan en la matriz de puntaje del estudiante

Calcule el promedio de todas las calificaciones de todos los estudiantes llamando a la función promedio

Muestre las calificaciones de las 4 tareas del estudiante número n llamando a la función de búsqueda.

Ideas:

Es necesario definir una puntuación de matriz bidimensional, y cada fila almacena las calificaciones de las 4 tareas de un estudiante. Si hay 3 filas, se almacenan las calificaciones de 3 estudiantes.

65 70 70 60 80
87 90 81
90 99 100 98
Al escribir la función promedio para calcular el puntaje promedio de todos los estudiantes, puede ver la matriz de puntajes desde la perspectiva de una matriz unidimensional, es decir, "pensar" que la matriz tiene 12 puntajes, sume directamente y calcule el puntaje promedio en la línea

Al escribir la función de búsqueda para mostrar las 4 tareas del enésimo estudiante, use la perspectiva de una matriz bidimensional para ver la matriz de puntuación, es decir, "piense" que la matriz tiene 3 filas, cada una con 4 elementos.

void average(float *p,int n)
{
    //以一维数组的方式看待学生成绩
    float *p_end;
    float sum=0,aver;
    p_end=p+n;
    for ( ; p<p_end;p++)
        sum=sum+(*p);
    aver=sum/n;
    printf("平均成绩为:%5.1f\n",aver);
}
void search(float (*p)[4],int n)//可以写成 float p[][4]
{
    //以二维数组的方式看待学生成绩,视角与score相同
    int i;
    printf("第%d个学生的成绩为: ",n);
    for (i=0;i<4;i++)
        printf("%5.1f",*(*(p+n)+i));  //可以替换成p[n][i]
}

int main()
{
    float score[3][4]={
   
   {65,67,70,60},{80,87,90,81},{90,99,100,98}};
    average(&score[0][0],12);        //可以替换成score[0],*(score+0)
    search(score,2);
    return 0;
}


Pensando (si no entiende, vuelva atrás y lea)
(1) La matriz de puntaje bidimensional se pasa a la función, ¿por qué la función promedio y la función de búsqueda se usan de diferentes maneras al pasar parámetros?

average(&score[0][0],12);        //可以替换成score[0],*(score+0)
search(score,2);                //显示第二个学生的成绩


Array bidimensional como parámetro de la función
1. "Mira" el array bidimensional desde la perspectiva del array unidimensional

 

 2. "Observe" una matriz unidimensional desde la perspectiva de una matriz bidimensional

 

 

Ejercicios después de clase
Descripción del tema: Escribe una función inversa, cuya función es re-almacenar los valores en un arreglo bidimensional de 3*4 en orden inverso.

Ejemplo de resultados de ejecución del programa

Introduzca una matriz bidimensional de 3*4:

1 2 3 4

5 6 7 8

9 10 11 12

El resultado después de almacenar en orden inverso es:

12 11 10 9

8 7 6 5

4 3 2 1

pista:

Este programa tiene una variedad de ideas de implementación, trate de usar dos métodos para lograr

Método de respuesta
1: vea el programa como una matriz bidimensional:

 

 

void inverse(int a[][N],int b[][N])
{
    int i,j;
    for (i=0;i<M;i++)
        for (j=0;j<N;j++)
            b[M-i-1][N-j-1]=a[i][j]
}

int main()
{
    int a[M][N],b[M][N];
    int i,j;
    printf("请输入 %d*%d 的二维数组:\n",M,N);
    for (i=0;i<M;i++)
        for (j=0;j<N;j++)
            scanf("%d",&a[i][j]);
    inverse(a,b);
    printf("逆序存放后的结果为:\n");
    for (i=0;i<M;i++)
    {
        for (j=0;j<N;j++)
            printf("%d\t",b[i][j]);
    }
}

Método 2: vea el programa como una matriz unidimensional: 

 

 

void swap(int *p1,int *p2)
{
    int tmp = *p1;
    *p1 = *p2;
    *p2 = tmp;
}

//以 int *a 这样的方式传参,使得在子程序中以一维的方式看待数组,
//也就是说,把数组看成了一个具有 M*N 个元素的,每个元素都是 int 的数组
void inverse(int *a,int n)
{
    int *p,*q;
    for (p=a,q=a+n-1;p<=q;p++,q--)
    {
        swap(p,q);
    }
}

int main()
{
    int a[M][N];
    int i,j;
    printf("请输入 %d * %d 的二维数组: \n");
    for (i=0;i<M;i++)
        for (j=0;j<M;j++)
            scanf("%d",&a[i][j]);
    inverse(&a[0][0],M*N);
    printf("逆序存放后的结果为: \n");
    for (i=0;i<M;i++)
    {
        for (j=0;j<N;j++)
            printf("%d\t",a[i][j]);
    	printf("\n");
    }
    return 0;
}

El programa usa dos constantes M y N, tal programa tiene buena flexibilidad. 

————————————————
Declaración de derechos de autor: Este artículo es el artículo original del bloguero de CSDN "Zong Gu". Sigue el acuerdo de derechos de autor CC 4.0 BY-SA. Para reimprimirlo, adjunte el enlace de la fuente original y esta declaración del artículo.
Enlace original: https://blog.csdn.net/Zonggu/article/details/124051465

Supongo que te gusta

Origin blog.csdn.net/modi000/article/details/131916851
Recomendado
Clasificación