zoukankan      html  css  js  c++  java
  • C 指针和多维数组 个人理解

    //可能有误解,后面再改
    #include<stdlib.h>
    #include<stdio.h>

    int main(void)
    {
        int he(int *p,int n);   //函数声明
        int he_1(int (*p)[3],int n);

        int a[5] = {1,2,3,4,5};
        int *pi;
        int (*p)[5];        //只能指向带5个元素的一维数组,不能指向某个元素,p的值应该是一维数组的起始位置
        //p = a;          //报错,类型不同
        p = &a;

        pi = a;       //两行是同样的意思,a 就是 &a[0]的地址
        //pi = &a[0];

        printf("%d ",p[3]);        //&a[3]的地址
        printf("%d ",(*p)[3]);     //a[3]的值

        printf("%d ",pi[3]);
        printf("%d ",*(pi+2));

        //我的理解是:虽然都是同样的地址,但是意义不同,
        //a是数组的首元素地址,就是a[0]的地址,操作的时候+1就是指向下一个元素
        //&a是数组的首地址,操作多维数组时,+1就指向下一行数组了
        printf("%d ",a);
        printf("%d ",*a);
        printf("%d ",&a);

        printf("一下是二维数组: ");
        //一维跟二维有不同点
        int b[2][3] = {{1,2,3},{11,22,33}};
        int (*pj)[3];
        pj = b;
        
        printf("%d ",pj);      //&b[0]
        printf("%d ",pj+1);    //&b[1]

        printf("%d ",*pj);     //b[0]的值,也就是&b[0][0]
        printf("%d ",*(pj+1)); //b[1]的值,也就是&b[1][0]
        printf("%d ",(*(pj+1)+1));    //也就是&b[1][1],是地址
        printf("%d ",*(*(pj+1)+1));    //也就是b[1][1],是值

        printf("%d ",(*pj)[1]);    //指针数组对应下标指向的值
        printf("%d ",*pj[1]);      //对应二维数组第二行,当超出数组范围也不会报错,但是值就不确定了
        printf("%d ",pj[1][1]);    //用类似数组的方式访问值


        printf("%d ",b);
        printf("%d ",*b);
        printf("%d ",&b);

        //一维和多维的区别也直接导致当作为函数形参传递时的不同
        printf("一维数组的和是:%d ",he(a,6));         //p = a,跟上面例子相同
        printf("二维数组的和是:%d ",he(*b,6));        //p = *b

        //printf("一维数组的和是:%d ",he_1(&a,2));     //类型不同,数组长度不一样不能用
        printf("二维数组的和是:%d ",he_1(b,2));       

        return 0;
    }

    int he(int *p,int n)        //求和的函数
    {
        int he1 = 0;
        for(int i= 0; i < n; i++,p++)
        {
            he1 = he1 + *p;
        }
        return he1;
    }

    int he_1(int (*p)[3],int n)        //求和的函数
    {
        int he1 = 0;
        for(int i= 0; i < n; i++)
        {
            for(int j= 0; j < 3; j++)
            {
                he1 = he1 + *(*(p+i)+j);
            }
        }
        return he1;
    }
  • 相关阅读:
    微信小程序 模板语法-列表渲染
    Fast Matrix Calculation HDU
    AT4845 [ABC164E] Two Currencies
    [ABC127E] Cell Distance
    CF18E Flag 2
    CF10C Digital Root
    CF8C Looking for Order
    [ARC075B] Widespread
    旅行商问题
    AcWing 291. 蒙德里安的梦想
  • 原文地址:https://www.cnblogs.com/hemage/p/13259959.html
Copyright © 2011-2022 走看看