当前位置: 首页 > news >正文

C语言学习笔记 Day10(指针--中)

Day10 内容梳理:

目录

Chapter 7  指针

7.4 指针 & 数组

(1)指针操作数组元素

(2)指针加减运算

1)加法

2)减法

(3)指针数组

7.5 多级指针


Chapter 7  指针

7.4 指针 & 数组

(1)指针操作数组元素

用指针获取数组的地址无需用符号&,因为数组本身存储的就是地址。

数组类型和指针类型相同时(比如int arr[]和int* p),arr[i] == p[i] == *(p+i)== *(arr+i)

用指针去操作数组的话,最好还是写成数组的样式(比如写成arr[i]而不是*(arr+i)。

*(arr + i)的具体含义:地址加偏移量再取值。arr是数组首个元素的地址,i是偏移量,*( )是取值。

需要注意的是,当数组作为函数参数出现在参数列表的话,会退化为指针,丢失掉数组的精度。也就是从一串数组的数据变成了单个的指针数据,所以传入参数时最好是:函数名(int* arr, int len),而不是函数名(int arr[])。

(2)指针和运算符

指针的数据类型要和操作的数据对应上。比如int arr[ ]最好适配int* p。

1)加法

指针加法加的是数据类型的长度。指针变量+1 等同于 内存地址+sizeof(类型)。

比如int* p++是增加一个int的大小,char* p++是增加一个char的大小。

逐个测试方式1、2、3,都能得到hello world

2)减法

数组中的下标如果出现负数,可能出现越界,比如arr[-2];但指针操作中可以出现负数,比如p[-2]就是指针往前移动两位。

如下图所示,数组中的arr[-2]是越界了,所以数字报错,而p[-2]没有越界:

3)其他运算符

指针最好还是加减位移量,两个指针互相加减乘除都会报错而且没有意义,报错如下:

(3)指针数组

指针数组存的元素是一个个指针。它的定义格式和数组相似,区别只在数据类型。

用指针数组打印变量,通过 *(地址) 就能取到该地址对应的值,如下图:

用指针数组打印二维变量数组,如下图:

数组和指针互通,所以可用指针取出多维数组的值。数组有几个维度,*符号就有多少个。以二维数组为例:

二级指针加偏移量,跳过了大小相当于一个一维数组。

比如在3×3的数组中尝试打印2,却打印出了4。

7.5 多级指针

二级指针是指向一级指针变量地址的指针。三级或更高级的指针基本用不上。

多级指针有些像寻宝,不断前往下一处线索所在的地址,直到来到最终的藏宝地,找到宝藏。对指针加*就是从上一个地点跑到下一个地点的过程,每加一个*,都离宝藏越近。

以下图为例,图中代码显示指针pp存的是指针p的地址,指针p存的是b的地址,所以有:

        *pp == p == &a

        **pp == *p == a

另外,可以加多个*符号。但程序不允许加多个&符号,因为容易与表示“并”的“&&”混淆。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 13.StringRedisTemplete使用
  • 巧用Array.forEach:简化循环与增强代码可读性;Array.forEach怎么用;面对大量数据时怎么提高Array.forEach的性能
  • C语言:字符函数,字符串函数
  • 《计算机网络 - 自顶向下方法》阅读笔记
  • 28. Hibernate 中的常见坑
  • webassembly初探
  • llama3.1本地部署方式
  • Java 中的泛型 集合(List,Set) Map
  • opencascade AIS_Line源码学习直线节点
  • 前端响应式布局解决方案分享
  • One-hot编码
  • 2024视频编辑网站微服务
  • android13去掉安全模式 删除安全模式
  • kafka 将log4j的项目升级到log4j2
  • 把外部资源利用到极致 如何利用大公司的dll插件 大公司的应用有大量的dll 还有windows系统dll
  • php的引用
  • #Java异常处理
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 2017-08-04 前端日报
  • Invalidate和postInvalidate的区别
  • jQuery(一)
  • ubuntu 下nginx安装 并支持https协议
  • vuex 学习笔记 01
  • webpack4 一点通
  • XML已死 ?
  • 程序员该如何有效的找工作?
  • 订阅Forge Viewer所有的事件
  • 服务器之间,相同帐号,实现免密钥登录
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 设计模式走一遍---观察者模式
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 网络应用优化——时延与带宽
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • 国内开源镜像站点
  • 湖北分布式智能数据采集方法有哪些?
  • 交换综合实验一
  • 整理一些计算机基础知识!
  • ​Spring Boot 分片上传文件
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • # 消息中间件 RocketMQ 高级功能和源码分析(七)
  • #职场发展#其他
  • (1)(1.13) SiK无线电高级配置(五)
  • (AngularJS)Angular 控制器之间通信初探
  • (k8s)Kubernetes本地存储接入
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (六)软件测试分工
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • *2 echo、printf、mkdir命令的应用