zoukankan      html  css  js  c++  java
  • C语言之二维数组与指针

    二维数组:

    char a[2][3];

    二维数组实质上也就是一维数组,a[2][3]可看做一个2个元素的一维数组,这2个元素又是另一个数组,在内存中,它的排布如下:

    #include "stdio.h"
    
    int main(int argc, char *argv[])
    {
        char a[2][3]={{1,3,9},{2,4,8}};
    
        for(int i=0; i<2;i++)
            for(int j=0;j <3;j++)
            {
                printf("a[%d][%d]=%d
    ", i, j, a[i][j]);
            }
        for(int i=0; i<2;i++)
            for(int j=0;j <3;j++)
            {
                printf("a[%d][%d] Addr=0X%X
    ", i, j, (int)&a[i][j]);
            }
        return 0;
    }

    数组指针:

    char a[2][3]={{1,3,9},{2,4,8}};
    char (*p)[3]=a;  //a为一维数组的数组名,类型为char (*)[3]
    char *p=a[1];    //a[1]为二维数组的数组名,即{2,4,8}数组的首地址,类型为char *
    char (*)p[2][3]=&a //&a为整个数组的首地址,类型为char (*)[2][3]

    二维数组传参:

    当定义了char a[2][3]={{1,3,9},{2,4,8}},如何将地址传入到函数中呢。函数对a数组进行修改呢。

    void Func(int (*array)[10]);  注意*array需要用括号括起来。

    这种形式的传参是1个指针,指向10个元素的数组,因为[]的优先级比*的优先级高,故*array必须用括号括起来。

    #include "stdio.h"
    void exchange(char (*p)[3]);
    
    int main(int argc, char *argv[])
    {
        char a[2][3]={{1,3,9},{2,4,8}};
    
        for(int i=0; i<2;i++)
            for(int j=0;j <3;j++)
            {
                printf("a[%d][%d]=%d
    ", i, j, a[i][j]);
            }
        printf("exchange
    ");
        exchange(&a[1]);
        for(int i=0; i<2;i++)
            for(int j=0;j <3;j++)
            {
                printf("a[%d][%d]=%d
    ", i, j, a[i][j]);
            }
        return 0;
    }
    
    void exchange(char (*p)[3])
    {
        char tmp=(*p)[0];
        (*p)[0] = (*p)[2];
        (*p)[2] = tmp;
    }

    例子解析:exchange(&a[1])将{2,4,8}数组的首地址传递给exchange,exchange使用(*p)获得{2,4,8}的地址,然后用(*p)[0]、(*p)[1]、(*p)[2]偏移并修改{2,4,8}数组的值。

    void Func(int *array[10]);

    这种形式的传参是10元素的数组,每个元素都是指向int型的指针。

    #include "stdio.h"
    void exchange(char *p[2]);
    
    int main(int argc, char *argv[])
    {
        char a[2][3]={{1,3,9},{2,4,8}};
    
        for(int i=0; i<2;i++)
            for(int j=0;j <3;j++)
            {
                printf("a[%d][%d]=%d
    ", i, j, a[i][j]);
            }
        printf("exchange
    ");
        char *p[2];
        p[0] = a[0];
        p[1] = a[1];
        exchange(p);
        for(int i=0; i<2;i++)
            for(int j=0;j <3;j++)
            {
                printf("a[%d][%d]=%d
    ", i, j, a[i][j]);
            }
        return 0;
    }
    
    void exchange(char *p[2])
    {
        char tmp=p[1][0];
        p[1][0] = p[1][2];
        p[1][2] = tmp;
    }

     例子解析:先使用char *p[2]定义了2个元素的数组,每个元素都是char *型,然后将a[0]和a[1]的地址赋给p[0]和p[1],exchange函数接收到p[2]的地址,使用p[1]就能得到a[1]的地址,然后使用p[1][0]、p[1][1]、p[1][2]偏移到a[1][0]、a[1][1]、a[1][2]。

  • 相关阅读:
    JavaScript模态对话框类
    事件模块的演变(1)
    html5中可通过document.head获取head元素
    How to search for just a specific file type in Visual Studio code?
    What do 'lazy' and 'greedy' mean in the context of regular expressions?
    正则非获取匹配 Lookahead and Lookbehind ZeroLength Assertions
    regex length 正则长度问题
    Inversion of Control vs Dependency Injection
    How to return View with QueryString in ASP.NET MVC 2?
    今天才发现Google Reader
  • 原文地址:https://www.cnblogs.com/hwli/p/10745446.html
Copyright © 2011-2022 走看看