• 指针、函数、二维数组之间的联系


    1.传递数组指针

     1 #include <stdio.h>
     2 void output( int (*pa)[3], int n )//这个函数只能输出n行3列的二维数组
     3 {
     4     int i,j;
     5     for( i=0;i<n;i++ ){
     6         for( j=0;j<3;j++ )
     7             printf("%d ", pa[i][j] );
     8         printf("
    ");
     9     }
    10 }
    11 void main()
    12 {
    13     int a[2][3]={
    14         {1,2,3},
    15         {4,5,6}
    16     };
    17     output(a,2);
    18 }

    2.传递“指针数组”  先将二维数组的行指针存储到一个指针数组中,再将指针数组传递到子函数中去

     1 #include <stdio.h>
     2 void output( int *pa[], int row,int col ) //这个函数更通用,但调用前,要做好准备工作。
     3 {
     4     int i,j;
     5     for( i=0;i<row;i++ ){
     6         for( j=0;j<col;j++ )
     7             printf("%d ", pa[i][j] );
     8         printf("
    ");
     9     }
    10 }
    11 void main()
    12 {
    13     int a[2][3]={
    14         {1,2,3},
    15         {4,5,6}
    16     };
    17     int i;
    18     int *pa[2];
    19     for( i=0;i<2;i++ )
    20         pa[i]=a[i];
    21     output(pa, 2, 3);
    22 }

    对于二维数组作为变量存在于函数中,有如下情况:

    void Func(int array[3][10]); 
    void Func(int array[][10]); 
    void Func(int(*array)[10]);
    

     如果要取p[i][j]的值,编译器是这样寻址的,它的地址为:

    p + i*n + j; 
    void Func(int array[3][10]);
    void Func(int array[][10]);
    变为:

    void Func(int **array, int m, int n);
    在转变后的函数中,array[i][j]这样的式子是不对的(不信,大家可以试一下),因为编译器不能正确的为它寻址,
    所以我们需要模仿编译器的行为把array[i][j]这样的式子手工转变为:

    *((int*)array + n*i + j);
    在调用这样的函数的时候,需要注意一下,如下面的例子:
    int a[3][3] =
    {
    {1, 1, 1},
    {2, 2, 2},
    {3, 3, 3}
    };
    Func(a, 3, 3);
    根据不同编译器不同的设置,可能出现warning 或者error,可以进行强制转换如下调用:
    Func((int**)a, 3, 3);
  • 相关阅读:
    BZOJ 3529 [Sdoi2014]数表
    bzoj 3195 [Jxoi2012]奇怪的道路
    BZOJ 4720 [Noip2016]换教室
    BZOJ 2160 拉拉队排练
    BZOJ 1031 [JSOI2007]字符加密Cipher 后缀数组教程
    BZOJ 1002 [FJOI2007]轮状病毒
    欧拉定理、拓展欧拉定理及其应用(欧拉降幂法)
    算术基本定理解析及其应用
    The 15th Zhejiang Provincial Collegiate Programming Contest(部分题解)
    网络流解析及其应用
  • 原文地址:https://www.cnblogs.com/2Bthebest1/p/7039963.html
Copyright © 2020-2023  润新知