C 指针和多维数组 个人理解

Posted 河马哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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\n",p[3]);        //&a[3]的地址
    printf("%d\n",(*p)[3]);     //a[3]的值

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

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

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

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

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


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

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

    //printf("一维数组的和是:%d\n",he_1(&a,2));     //类型不同,数组长度不一样不能用
    printf("二维数组的和是:%d\n",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;
}

以上是关于C 指针和多维数组 个人理解的主要内容,如果未能解决你的问题,请参考以下文章

图解多级指针与“多维”数组

C多维数组中的指针地址

《C专家编程》数组和指针并不同--多维数组

如何理解JS多维数组

《C专家编程》数组和指针并不同--多维数组

C之多维数组和多维指针(三十一)