码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • C语言指针操作(三)*通过指针引用多维数组


    在这里插入图片描述

    学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。 

    学习日记

    目录

    学习日记

    前言​编辑

     一、多维数组元素的地址

    例

    二、指向数组元素的指针变量

    三、指向由m个元素组成的一维数组的指针变量 

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

    例

     C语言指针操作


    前言

            指针这里分为八个小部分,分别是“指针变量”、“通过指针引用数组”、“*通过指针引用多维数组”、“通过指针引用字符串”、“*指向函数的指针”、“*返回指针值的函数”、“*指针数组和多重指针”、“*动态内存分配与指向它的指针变量” 。 

     一、多维数组元素的地址

    表示形式

    含义

    地址

    a

    二维数组名,指向一维数组a[0],即0行起始地址

    2000

    a[0], *(a+0), *a

    0行0列元素地址

    2000

    a+1, &a[1]

    指向第1行起始地址

    2016

    a[1], *(a+1)

    1行0列元素a[1][0]的地址

    2016

    a[1]+2, *(a+1)+2, &a[1][2]

    1行2列元素a[1][2]的地址

    2024

    *(a[1]+2), *(*(a+1)+2), a[1][2]

    1行2列元素a[1][2]的值

    是元素值,为13

            C语言的地址信息中既包含位置信息(如内存编号2000),还包含它所指向的数据的类型信息。 a[0]是一维数组名,它是一维数组中起始元素的地址,a是二维数组名,它是二维数组的首行起始地址,二者的纯地址是相同的,即2000,但它们的基类型不同,即它们指向的数据的类型不同,前者是整型数据,后者是一维数组。

    1. int (*pt)[4];
    2. //表示pt指向由4个整型元素组成的一维数组,此时指针变量pt的基类型是由4个整型元素组成的一维数组

    例

            输出二维数组的有关数据(地址和元素的值)。

    1. #include <stdio.h>
    2. int main()
    3. { int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
    4. printf("%d,%d\n",a,*a); //0行起始地址和0行0列元素地址
    5. printf("%d,%d\n",a[0],*(a+0)); //0行0列元素地址
    6. printf("%d,%d\n",&a[0],&a[0][0]); //0行起始地址和0行0列元素地址
    7. printf("%d,%d\n",a[1],a+1); //1行0列元素地址和1行起始地址
    8. printf("%d,%d\n",&a[1][0],*(a+1)+0); //1行0列元素地址
    9. printf("%d,%d\n",a[2],*(a+2)); //2行0列元素地址
    10. printf("%d,%d\n",&a[2],a+2); //2行起始地址
    11. printf("%d,%d\n",a[1][0],*(*(a+1)+0)); //1行0列元素的值
    12. printf("%d,%d\n",*a[2],*(*(a+2)+0)); //2行0列元素的值
    13. return 0;
    14. }

    二、指向数组元素的指针变量

            有一个3×4的二维数组,要求用指向元素的指针变量输出二维数组各元素的值。

    1. #include <stdio.h>
    2. int main()
    3. { int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
    4. int *p; //p是int *型指针变量
    5. for(p=a[0];p<a[0]+12;p++) //使p依次指向下一个元素
    6. { if((p-a[0])%4==0) printf("\n"); //p移动4次后换行
    7. printf("%4d",*p); //输出p指向的元素的值
    8. }
    9. printf("\n");
    10. return 0;
    11. }

            p是一个int *型(指向整型数据)的指针变量,它可以指向一般的整型变量,也可以指向整型的数组元素。每次使p值加1,使p指向下一元素。

    三、指向由m个元素组成的一维数组的指针变量 

            输出二维数组任一行任一列元素的值。

    1. #include <stdio.h>
    2. int main()
    3. { int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23}; //定义二维数组a并初始化
    4. int (*p)[4],i,j; //指针变量p指向包含4个整型元素的一维数组
    5. p=a; //p指向二维数组的0行
    6. printf("please enter row and colum:");
    7. scanf("%d,%d",&i,&j); //输入要求输出的元素的行列号
    8. printf("a[%d,%d]=%d\n",i,j,*(*(p+i)+j)); //输出a[i][j]的值
    9. return 0;
    10. }

     int a[4];

    (a有4个元素,每个元素都为整型)

            注意指针变量的类型

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

            一维数组名可以作为函数参数,多维数组名也可作函数参数。 用指针变量作形参,以接受实参数组名传递来的地址。可以有两种方法:

    ① 用指向变量的指针变量。

    ② 用指向一维数组的指针变量。

    例

            有一个班,3个学生,各学4门课,计算总平均分数以及第n个学生的成绩。 

    1. #include <stdio.h>
    2. int main()
    3. { void average(float *p,int n);
    4. void search(float (*p)[4],int n);
    5. float score[3][4]={{65,67,70,60},{80,87,90,81},{90,99,100,98}};
    6. average(*score,12); //求12个分数的平均分
    7. search(score,2); //求序号为2的学生的成绩
    8. return 0;
    9. }
    10. void average(float *p,int n) //定义求平均成绩的函数
    11. { float *p_end;
    12. float sum=0,aver;
    13. p_end=p+n-1;
    14. //n的值为12时,p_end的值是p+11,指向最后一个元素
    15. for(;p<=p_end;p++)
    16. sum=sum+(*p);
    17. aver=sum/n;
    18. printf("average=%5.2f\n",aver);
    19. }
    20. void search(float (*p)[4],int n)
    21. //p是指向具有4个元素的一维数组的指针
    22. { int i;
    23. printf("The score of No.%d are:\n",n);
    24. for(i=0;i<4;i++)
    25. printf("%5.2f ",*(*(p+n)+i));
    26. printf("\n");
    27. }

            实参与形参如果是指针类型,应当注意它们的基类型必须一致。不应把int *型的指针(即数组元素的地址)传给int (*)[4] 型(指向一维数组)的指针变量,反之亦然。

     C语言指针操作

    C语言指针操作(一)指针变量

    C语言指针操作(二)通过指针引用数组

    C语言指针操作(三)*通过指针引用多维数组 

    C语言指针操作(四)通过指针引用字符串

    C语言指针操作(五)*指向函数的指针

    C语言指针操作(六)*返回指针值的函数 

    C语言指针操作(七)*指针数组和多重指针 

    C语言指针操作(八)*动态内存分配与指向它的指针变量

  • 相关阅读:
    卷积神经网络CNN学习笔记-卷积计算&Conv2D函数的理解
    MySQL数据库
    tortoise 快捷操作分支合并
    基于Springboot+MYSQL+Maven实现的宠物医院管理系统(源码+数据库+运行指导文档+项目运行指导视频)
    SpringSecurity系列——安全Http响应头day8-2(源于官网5.7.2版本)
    客观看待mybatis 中使用 where 1=1
    基于SSM+Jsp的书店仓库管理系统
    数据资产、数字资产、数据资源及数据资产入表
    【解决方案】Ubuntu设置Matlab桌面启动快捷方式
    MyBatis是如何为Dao接口创建实现类的
  • 原文地址:https://blog.csdn.net/m0_63794226/article/details/126554519
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号