• 多维数组与指针{笔记}


    a:表示二维数组名,指向一维数组a[0],即0行首地址;

    a[0],*(a+0),*a:表示0行0列元素地址;

    a+1,&(a+1):1行首地址

    a[1]+2,*(a+1)+2,&a[1][2]:1行2列元素a[1][2]的地址

    *(a[1]+2,*(*(a+1)+2),a[1][2]:1行2列元素a[1][2]的值

    二维数组名是指向行的;

    例如:a和a+1是指向行的指针,在前面加*就是*a和*(a+1),就成为指向列的指针,分别指向a数组0行0列的元素和1行0列的元素;反之,在指向列的指针前面加上&,就成为指向行的指针;

    &a[i]或a+i指向行,a[i]或*(a+i)指向列,当列下标为0时,&a[i]和a[i](即a[i]+j)值相等,即相同地址值,但是指向的对象是不同的,指针的类型不同;

    在二维数组中,a+i、a[i]、*(a+i)、&a[i]、&a[i][0]的值相等,都是同一地址值;

    例子:

    #include <studio.h>
    #define FORMAT "%d,%d "
    void int main()
    {
    int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
    printf(FORMAT,a,*a);
    printf(FORMAT,&a[0],&a[0][0]);
    printf(FORMAT,a[1],a+1);
    printf(FORMAT,&a[1][0],*(a+1)+0);
    printf(FORMAT,a[2],*(a+2));
    printf(FORMAT,&a[2],a+2);
    printf(FORMAT,a[1][0],*(*(a+1)+0));
    return 0;
    }

     例子:用指针变量输出二维数组元素的值。

    #include <studio.h>
    #define FORMAT "%d,%d "
    void int main()
    {
    int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
    int *p;
    for (p=a[0];p<a[0]+12;p++)
    {
    if ((p-a[0])%4==0)
    {
    printf(" ");
    printf("%4d ",*p);
    }
    }
    printf(" ");
    return 0;
    }

    解:p是一个指向整型变量的指针变量,每次p值加1,使p指向下一元素,if语句作用是输出4个数据后换行;

    例子2:输出数组任一行任一列元素的值

    #include <studio.h>
    #define FORMAT "%d,%d "
    void int main()
    {
    int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
    int (*p)[4],i,j;//(*p)[4]表示p是一个指针变量,指向包含4个整型元素的一维数组;*p有4个元素,每个元素为整型,p所指的对象是有4个整型元素的数组,p是指向一维数组的指针,p的值就是该一维数组的起始地址;
    p=a;
    scanf("i=%d,j=%d",&i,&j);
    printf("a[%d,%d]=%d ",i,j,*(*(p+i)+j) );

    return 0;
    }

    用指向数组的指针作函数参数

    用指针变量作形参以接受实参数组名传递来的地址,方法:1、用指向变量的指针变量;2、用指向一维数组的指针变量;

    #include <studio.h>
    void int main()
    {
    void average(float *p,int n);
    void search(float (*p)[4],int n);
    float score[3][4]={{65,67,70,60},{80,87,90,81},{90,99,100,98}};
    average(*score,12);
    search(score,2);

    return 0;
    }
    void average(float *p,int n)
    {
    float *p_end;
    float sum=0;aver;
    p_end=p+n-1;
    for (;p<=p_end;p++)
    {
    sum=sum+(*p);
    aver=sum/n;
    printf("average=%5.2f ",aver);
    }
    }

    void search(float(*p)[4],int n)
    {
    int i;
    printf("the score of no.%d are: ", n);
    for (i=0; i<4;i++)
    {
    printf("%5.2f ",*(*(p+n)+i));
    }
    }

    lr 中运行:

    Action()

    {

    float a[3][4]={{65,67,70,60},{80,87,90,81},{90,99,100,98}};

    float *p;//指针变量

    float *pl;//指针变量

    float sum,aver;

    p=&a[0][0];

    pl=a[0]+12-1;

    for(;p<=pl;p++)

    {

    sum+=*p; aver=sum/12;

    }

    lr_output_message("aver=%f",aver);

    return 0;

    }

    查找一门以上课程不及格的学生,输出他们的全部课程的成绩

    #include <studio.h>
    void main()
    {

    void search(float(*p)[4],int n);
    float score[3][4]={{65,67,70,60},{80,87,90,81},{90,99,100,98}};
    search(score,3);
    return;
    }

    void search(float(*p)[4],int n)
    {
    int i,j,flag;
    for (j=0;j<n;j++)
    {
    flag=0;
    for (i=0;i<4;i++)
    {
    if (*(*(p+j)+i)<60)
    {
    flag=1;
    }
    if (flag==1)
    {
    printf("NO.%d fails,his scores are: ",j+1);
    for (i=0;i<4;i++)
    {
    printf("%5.1f ",*(*(p+j)+i));
    printf(" ");
    }
    }
    }
    }
    }

    指针变量存取数组元素速度快,用指针变量做形参,处理的数组大小可以变化;

  • 相关阅读:
    idea快捷键总结
    将对象序列化和反序列化
    在Springmvc中获取properties属性
    配置springmvc在其他类中(spring容器外)获取注入bean
    redis学习之三配置文件redis.conf 的含义
    redis学习之二from github
    敏捷开发方法XP的12个最佳实践
    IIS-网站发布之后访问HTTP 错误 403.14
    IIS-将iis直接指向.net代码会出现错误
    HTTP 错误 500.24
  • 原文地址:https://www.cnblogs.com/collect/p/4123804.html
Copyright © 2020-2023  润新知