C语言学习笔记 (007) - 数组指针和通过指针引用数组元素的方法总结
1.数组指针:即指向数组的指针
那么, 如何声明一个数组指针呢?
int (* p)[]; /*括号是必须写的,不然就是指针数组;10是数组的大小*/
拓展:有指针类型元素的数组称为指针数组。
2.通过指针引用数组元素的基本方法
(1)小标法:a[i]。
(2)指针法:* (a+i) 或 * (p+i) 或 p[i]。其中,a是数组名,p=a,即p指向数组a首元素的地址。
问:为什么* (a+i) 和* (p+i)是等价的,或者说是引用的同一个数组元素呢?
答:在C语言中,数组名代表的是数组中首元素的地址。在程序编译时,a[i]是按*(a+i)处理的,即按数组元素的首地址加上相应位移量i找到新元素的地址。而p=a,即p是指向数组a的首元素的地址,因此是等价的。从这里可以看出,[ ]实际上是变地址运算符,即将a[i]按a+i计算地址,然后找此地址单元中的值。
问:为什么p[i] 和* (p+i)是等价的,或者说是引用的同一个数组元素呢?
答:c语言规定,当指针变量指向数字元素时,指针变量可以带下标。而在程序编译时,对此下标处理的方法是转换为地址,即对p[i] 处理成 (p+i)。同上,[ ]是变址运算符。
3.利用指针引用数组元素
(1)p++; *p;
(2)*p++;
等价于*(p++);
因为++和*的优先级一样,故结合方向是从右向左。
(3)*(p++);和*(++p);
二者是有区别的。前者是先取*p的值,然后p加1;后者是先p加1,再取p的值。即如果p指向的是数组a元素a[0],则前者得到a[0]的值,后者得到a[1]的值。
(4)++(*p);
将p指向的元素的值加1。
(5)如果p指向元素a[i], *(p--);
先得到p指向的地址的元素a[i],然后p减1。
*(++p);执行结果得到a[i+1],p加1。
*(–p);执行结果得到a[i-1],p减1。
4.利用指针输出数组元素
int a[];
int * p;
p = a;
while(p<a+)
printf("%d",*p++);
或
int a[];
int * p;
p = a;
while(p<a+)
{
printf("%d",*p);
p++;
}
或
int a[];
int * p;
p = a;
for(i=;i<;i++)
printf("%d",*p++);
或
int a[];
int * p;
for(p=a;p<a+;p++) /*比较专业的写法,代码简洁、高效*/
printf("%d",*p);
思考:下面代码能不能正确输出数组元素的值呢?
int a[];
int * p;
for(p=a;p<a+;a++)
printf("%d",*a);
答:是不行的。因为数组名a代表的是数组首元素的地址,是一个指针型常量,它的值在程序运行期间是不改变的,即a++是不变的。
因此,结合动态分配数组,我们可以建立一个一维的数组指针:
int (* array)[N]=(int *)malloc(N*sizeof(int));
C语言学习笔记 (007) - 数组指针和通过指针引用数组元素的方法总结的更多相关文章
- Go语言学习笔记九: 指针
Go语言学习笔记九: 指针 指针的概念是当时学C语言时了解的.Go语言的指针感觉与C语言的没啥不同. 指针定义与使用 指针变量是保存内存地址的变量.其他变量保存的是数值,而指针变量保存的是内存地址.这 ...
- Go语言学习笔记八: 数组
Go语言学习笔记八: 数组 数组地球人都知道.所以只说说Go语言的特殊(奇葩)写法. 我一直在想一个人参与了两种语言的设计,但是最后两种语言的语法差异这么大.这是自己否定自己么,为什么不与之前统一一下 ...
- GO语言学习笔记(一)
GO语言学习笔记 1.数组切片slice:可动态增长的数组 2.错误处理流程关键字:defer panic recover 3.变量的初始化:以下效果一样 `var a int = 10` `var ...
- Go语言学习笔记二: 变量
Go语言学习笔记二: 变量 今天又学了一招如何查看go的版本的命令:go version.另外上一个笔记中的代码还可以使用go run hello.go来运行,只是这种方式不会生成exe文件. 定义变 ...
- Go语言学习笔记(1)——顺序编程
Go语言学习笔记这一堆主要是<Go语言编程>(人民邮电出版社)的读书笔记.中间会穿插一些零碎的点,比如源码学习之类的.大概就是这样吧. 1. 顺序编程 1.1 变量 变量的声明: var ...
- Go语言学习笔记十二: 范围(Range)
Go语言学习笔记十二: 范围(Range) rang这个关键字主要用来遍历数组,切片,通道或Map.在数组和切片中返回索引值,在Map中返回key. 这个特别像python的方式.不过写法上比较怪异使 ...
- Go语言学习笔记十一: 切片(slice)
Go语言学习笔记十一: 切片(slice) 切片这个概念我是从python语言中学到的,当时感觉这个东西真的比较好用.不像java语言写起来就比较繁琐.不过我觉得未来java语法也会支持的. 定义切片 ...
- Go语言学习笔记十: 结构体
Go语言学习笔记十: 结构体 Go语言的结构体语法和C语言类似.而结构体这个概念就类似高级语言Java中的类. 结构体定义 结构体有两个关键字type和struct,中间夹着一个结构体名称.大括号里面 ...
- Go语言学习笔记七: 函数
Go语言学习笔记七: 函数 Go语言有函数还有方法,神奇不.这有点像python了. 函数定义 func function_name( [parameter list] ) [return_types ...
随机推荐
- 转:ffmpeg time_base详解
ffmpeg time_base详解 https://my.oschina.net/u/3054677/blog/866368
- 云服务器 ECS Linux Ubuntu 主机修改主机名
云服务器 ECS Linux 主机修改主机名 修改云服务器 ECS Linux 主机名常见的有两种方式,本文对此进行概要说明. 临时生效修改 使用命令行修改 hostname 主机名(可自定义),重新 ...
- Android面试题收集
Android是一种基于Linux的自由及开放源码的操作系统,主要使用于移动设备.如智能手机和平板电脑.由Google公司和开放手机联盟领导及开发.这里会不断收集和更新Android基础相关的面试题, ...
- [RxJS] Build your own RxJS
JavaScript has multiple APIs that use callback functions that all do nearly the same thing with slig ...
- [Node.js] process.nextTick for converting sync to async
For example we have a function to check the filesize: const fs = require('fs'); function fileSize (f ...
- Format Conditions按条件显示表格记录
标记特定记录 DevExpress强大得确实让人觉得它别具一格!现在,我有这样一个需求,把一个表中某字段为False的记录标记出来.下面是效果(某字段的可见性为否): 实现方式 如果是以前,我写个代码 ...
- 【jeecg-mybatis版本】 mybatis+spring mvc 完美整合方案 查询,保存,更新,删除自动生成
Jeecg-Mybatis版本代码生成器演示视频 http://pan.baidu.com/share/link?shareid=243717&uk=2668473880 简要说明 JE ...
- uni-app - 上传图片组件
2018-12-29 更新1.0 2019-01-08 更新1.1 2019-01-29 更新1.3 重大更新 插件地址: http://ext.dcloud.net.cn/plugin?id= ...
- 微信小程序 - 下拉菜单组件
使用: 1.导入组件 2.使用组件 3.数据传入 4. 获取数据(通过同步缓存,获取“choose”)- 发送到后端 点击下载:小程序-下拉组件.
- 微软BI 之SSRS 系列 - 解决Pie Chart 中控制标签外部显示与标签重叠的问题
当 Pie Chart 页面标签过多的时候,往往数字标签内容挤做一团.我们要做的是:第一,让标签在饼图外部显示:第二,不让标签重叠. 一种做法是通过修改数字标签属性 - Series Label Pr ...