C语言基础之指针2(数组篇)

指针计划分成3篇来讲: 上篇是指针的基本使用 、 中篇指针与数组的联系、下篇是指针与字符串的联系

        经过上篇文章的学习,相信大家已经掌握了指针的基本应用。声明并初始化指针、指针解引用这些属于指针的初级技能,小伙伴们请务必勤加练习。数组篇的难度相比以上一章是上了一个台阶,并且掌握它将对后面指针与字符串的联系有极大的帮助,所以请努力加油吧。

一、回顾数组

        在C语言中,数组是使用一组连续的地址来存储具有相同类型数据的一种容器。连续地址主要是方便我们去通过地址偏移找到隔壁或者下一个数据,所以想一想,我们能够使用 [ 下标 ] 的方式取出数组中的每一个元素数组,其实全仰仗与这一特性。同时数组名字单独使用即表示指向首元素的地址,所以平常我们在函数参数传递数组都直接把数组名字传递进去,而函数形参则声明成指针类型。

1.1. 数组基本操作

#include <stdio.h>
int main(){
   //1. 定义数组
   int arr[] = {10,20,30,40,50};
   //2. 通过下标赋值
   arr[0] = 100;
   //3. 数组的长度
   int len = sizeof(arr) / sizeof(int);
   //4. 遍历数组
   for(int i = 0 ; i < len ; i++){
      printf("第 %d 个元素是: %d \n" , i , arr[i]);
   }
   return 0 ;
}

1.2. 数组名字的奥义

        事实上如果我们把数组看成是一种特殊的变量也是可以的,只是这种变量比较巨大,有点大胃王的意思,在它内部包装着许多小的元素。我们可以把数组中的每一个元素拿出来然后单独取地址,同时我们也可以尝试对数组名字取地址,然后观察对比就会发现通过数组名字取到的地址其实就是数组首元素的地址。

#include <stdio.h>

int main(){
   //1. 定义数组
   int arr[] = {10,20,30,40,50};

   //2. 依次对每一个元素取地址
   printf("第0个元素的地址是: %#x \n" , &arr[0]); // 0x2d9ff6a0
   printf("第1个元素的地址是: %#x \n" , &arr[1]); // 0x2d9ff6a4
   printf("第2个元素的地址是: %#x \n" , &arr[2]); // 0x2d9ff6a8
   printf("第3个元素的地址是: %#x \n" , &arr[3]); // 0x2d9ff6ac
   printf("第4个元素的地址是: %#x \n" , &arr[4]); // 0x2d9ff6b0

   //3. 同时也对数组名字取地址
   printf("对数组名字取地址:%#x \n" , &arr); // 0x2d9ff6b0

   //4. 甚至可以直接使用%#x 的格式打印数组
   printf("直接打印数组:%#x \n" , arr); // 0x2d9ff6b0

   return 0 ;
}

柯南有话说

        通过上面的示例我们可以得出两个结论:

        a. 数组是采用一串连续的地址存放数据 【所以这能解开为什么C语言不允许数组里面出现不同的数据类型了吧,因为不好做地址偏移,偏移多少距离这是个难题,如果存储的都是同一种数据类型,那么偏移的步长其实就固定了。】

        b. 数组名字单独使用即代表首元素地址 【所以这能理解为什么把数组传递给函数的时候,参数的形参声明位指针类型也可以接收的原因啦。同时还要记着在这种通过参数传递的数组在函数内部是无法计算它的长度的,因为此时传递过来的只是首元素的地址而已。】

二、指针运算

1. 变量的运算

假如存在一个int类型的变量,那么我们可以对这个变量进行加法运算和减法运算【这不是废话嘛..~额,不是!绝对不是!!】

#include <stdio.h>

int main(){
   //1. 定义int类型变量
   int number = 10 ;
  
   //2. 实际上就是在 值 + 1 
   number++;
   printf("number=%d \n", number);  //此时打印11  

   //3. 实际上就是在  值 - 1 
   number--; 
   printf("number=%d \n", number);  // 此时打印10
   return 0 ;
}

2. 指针的运算

        指针也是一种特殊的变量,既然变量可以做加法和减法运算,那么我们不妨大胆的假设,指针应该也可以做加法和减法运算。如果我们对指针做加法和减法运算,那么会是什么效果呢?指针接收的就是一个地址而已,对地址进行加法和减法操作,能成功么?我们来试一下。

#include <stdio.h>

int main(){
   //1. 定义int类型变量
   int number = 10 ;
   printf("number的地址是:%#x \n" , &number); // 0x173ff83c

   //2. 定义指针指向number
   int * p = &number;   
   //询问指针的值,其实就是指针p这个小房子装的是什么?其实就是number 的地址
   printf("指针p的值是:%#x \n" , p);  // 0x173ff83c

   //3. 让指针 ++
   p++;
   printf("指针p++之后的值是:%#x \n" , p); // 0x173ff840
   p++; 
   printf("指针p++之后的值是:%#x \n" , p); // 0x173ff844

   //4. 让指针
   p--; 
   printf("指针p--之后的值是:%#x \n" , p); // 0x173ff840   
   p--;
   printf("指针p--之后的值是:%#x \n" , p); // 0x173ff83c
 
   return 0 ;
}

柯南有话说

          观察上面的示例发现: 其实对指针+1 其实根本不是让地址值 +1 ,而是让指针的值发生了新的指向,指向位置偏移了所指向的数据占用的空间字节数。比如:指针原来的值是 0x173ff83c , 经过++之后,打印出来的值是: 0x173ff840 。 这其实是偏移了4个字节,再次经过++,打印出来的值是: 0x173ff844 这也是偏移了4个字节。后续的 -- 操作也是如此,只不过是指向地址向后倒退而已。由于++之后,同样执行了 --,所以最终指针又重新指向了原来的位置,也就是number。  

三、指针与数组

        小伙伴们当你们阅读了前面的内容之后,其实就会发现指针和数组是有联系的,并且也是可以联系起来的。数组是采用一串连续的地址存放数组,指针经过运算之后发生偏移,偏移的位置正好是指向位置数据所占用的长度。所以使用指针来操作数组中的元素有没有搞头呢?

#include <stdio.h>

int main(){
  //1. 定义数组
  int arr[] = {10,20,30,40,50};
   
  //2. 指针操作数组

  //2.1 使用指针指向数组的第0个元素
  int *p = &arr[0];

  //2.2 使用指针解引用每一个元素
  printf("使用指针p解引用第 0 个元素: %d \n" , *p ); //事实上这里可以写成 *(p+0) 打印10
  printf("使用指针p解引用第 1 个元素: %d \n" , *(p+1) );  // 打印20
  printf("使用指针p解引用第 2 个元素: %d \n" , *(p+2) );  // 打印30
  printf("使用指针p解引用第 3 个元素: %d \n" , *(p+3) );  // 打印40
  printf("使用指针p解引用第 4 个元素: %d \n" , *(p+4) );  // 打印50

  //2.3 直接使用指针指向数组名字
  int *p2 = arr; 

  printf("使用指针p2解引用第 0 个元素: %d \n" , *p2 ); //事实上这里可以写成 *(p2+0)  打印10
  printf("使用指针p2解引用第 1 个元素: %d \n" , *(p2+1) );  // 打印20
  printf("使用指针p2解引用第 2 个元素: %d \n" , *(p2+2) );  // 打印30
  printf("使用指针p2解引用第 3 个元素: %d \n" , *(p2+3) );  // 打印40
  printf("使用指针p2解引用第 4 个元素: %d \n" , *(p2+4) ); // 打印50

  //2.4 干脆来劲一点,直接对数组名字进行运算
  printf("数组名字运算解引用第 0 个元素: %d \n" , *arr ); //事实上这里可以写成 *(arr +0)  打印10
  printf("数组名字运算解引用第 1 个元素: %d \n" , *(arr+1) );  // 打印20
  printf("数组名字运算解引用第 2 个元素: %d \n" , *(arr+2) );
  printf("数组名字运算解引用第 3 个元素: %d \n" , *(arr+3) );
  printf("数组名字运算解引用第 4 个元素: %d \n" , *(arr +4) );
   
   return 0 ;
}

柯南有话说:

        运行上面的代码会发现都能正确的打印出来数组的所有元素,一开始使用指针接收数组元素,然后指针运算取出每一个元素。接着我们使用指针来指向数组名字【其实数组名字单独使用即表示首元素的地址,所以和第一种没什么两样】。后来我们直接在数组名字上操作了,那是因为数组名字单独使用就是首元素的地址,我们又何必声明一个指针变量来接收它呢,直接处理它也是可以的。其实我们使用 【下标】的方式背后就是采用指针偏移的方式取出了每一个元素。

四、总结

好啦~快乐的时光总是这么短暂 【终于熬完了~】,经过这一章的学习,大家对于指针的理解又更上了一层楼啦~相比与前一天的声明初始化、解引用,这一章更注重一些现象背后的原因,同时对于数组的理解又加深了一些【真的是一些吗?】。但是同时也需要警惕在指针的指向、偏移、运算中迷失了方向,最终不知道指向了何处。这一章大家请务必用心掌握,因为下一章的字符串将联系上这里的内容。加油吧~~前行者~~

五、思考

1. 上一章答案:

a. 指针声明未初始化,贸然使用操作指针,有可能会导致程序运行出错。因为该指针指向的目标位置不确定,贸然操作会容易导致其他程序崩溃,或者导致自己程序崩溃终止。

b. 指针其实可以指向目标值,其实也可以指向指针。若是产生了指针指向指针,那么即出现了二级指针。通常把指向指针的指针称之为二级指针,被指向的指针称之为一级指针。

c. 指针的类型最好与所指向的数据类型保持一致,这样在解引用的时候能够清晰的知道到底需要准备的是什么类型的数据或者获取到的是什么类型的数据。甚至有时候会数据精度丢失、不准确等问题


2. 思考一下

a. 数组采用一串连续的地址存放数据的目的是什么呢?

b. 若事先一个数组int arr [] = {1,2,3,4}, 能否出现这样的代码: arr={10,20,30,40} ?

c. 数组中的元素可以修改,但是能否对数组中的元素进行动态的增加、删除?

  • 20
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
# 智慧旅游解决方案摘要 智慧旅游解决方案旨在通过新一代信息网络技术和装备,实现旅游服务、管理、营销和体验的智能化。该方案响应国家政策背景,如国家旅游局和工业信息化部的指导意见,以及国家发改委的发展规划,强调数字化、网络化、智能化在旅游业的应用,推动5G和移动互联网技术在旅游领域的创新应用。 方案的建设目标围绕“一个中心、四个方面、五大平台”展开,即以智慧旅游数据中心为核心,面向服务、管理、商务和营销构建智慧景区管理平台、智慧旅游服务平台、智慧旅游商务平台和智慧旅游营销平台。这五大平台将整合全域旅游资源,提升旅游设施,拓展旅游空间,融合旅游产业链,提升旅游服务,定制旅游产品,推进旅游改革。 建设内容涵盖了整体架构的构建,包括智慧服务、智慧管理、电子商务和智慧营销等方面。通过云计算、人工智能、大数据、物联网、5G等技术,实现“云-管-端”服务能力,打造集时间、空间、层次为一体的体验平台。此外,还包括智慧景区管理平台的多个子系统,如视频监控、应急指挥调度、流量监测、舆情监督、线路SOS一键呼救、GIS人车调度、停车场管理、语音广播、环境监测管理、多媒体发布、电子巡更以及指挥调度大屏建设等。 智慧旅游服务平台则包括自助票务系统、人脸识别、扫码购票、景区门户网站、机游、WIFI覆盖系统、数字全景VR、AI机器人、智慧座椅、智慧厕所等,旨在提升游客体验,实现景区的智能化管理和服务。通过这些服务,游客可以享受到便捷的购票、入园、导览和信息服务,同时景区管理者能够更有效地监控和管理景区运营。 智慧旅游商务平台则侧重于旅行社团队申报、电子商城、综合票务系统、分销管理系统、大会员系统和景区聚合支付系统,为旅游企业提供全面的商务服务和营销支持。这些平台和系统帮助旅游企业拓宽分销渠道,实现财务管理和订单管理,同时为游客提供便捷的支付和会员服务。 最后,智慧营销平台通过综合票务系统、分销管理系统、大会员系统和景区聚合支付系统,为旅游行业提供精准的营销工具和策略。这些工具和策略有助于整合旅游资源,拓宽销售渠道,提升游客体验,实现旅游业务的数字化和智能化。 智慧旅游解决方案通过这些综合性的技术和平台,不仅提升了游客的旅游体验,还为旅游行业的可持续发展提供了强有力的技术支持和数据驱动的决策依据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值