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]。

  • 相关阅读:
    高可用架构案例一
    小程序页面可以放置转发按钮,同时开放了微信运动步数背景音乐播放等更多基础能力
    [今日干货]微博如何才能快速增粉?
    [今日干货]短视频获得种子用户的途径
    【今日干货】分享个微信解绑手机号的方法
    群用户通过微信小程序可以更好地协作了
    微信小程序首支视频广告片发布
    微信公众号可快速创建“门店小程序” 不用开发
    公众号和小程序可以同名了 名称支持同主体复用
    公众号群发文章支持添加小程序
  • 原文地址:https://www.cnblogs.com/hwli/p/10745446.html
Copyright © 2011-2022 走看看