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 ...
随机推荐
- TensorFlow实战12:Bidirectional LSTM Classifier
https://blog.csdn.net/felaim/article/details/70300362 1.双向递归神经网络简介 双向递归神经网络(Bidirectional Recurrent ...
- 浅谈APP流式分页服务端设计(转)
http://www.jianshu.com/p/13941129c826 a.cursor游标式分页 select * from table where id >cursor limit pa ...
- Linux源码包安装过程及注意事项
众做周知RedHat Linux使用RPM包管理器安装rpm包,但是RPM包是由红帽编译打包的,通常相对于最新版落后了很多,甚至可能缺少我们所要使用的功能.如果你需要定制想要的软件功能.自定义安装路径 ...
- 如何把本地代码提交到git(码云)、github代码管理项目上
前提必须安装了git工具 以下命令操作都是通过git bash操作. 将本地代码提交到码云空项目操作: D:\>mkdir inek_winprop D:\>cd inek_winprop ...
- Java归去来第4集:java实战之Eclipse中创建Maven类型的SSM项目
一.前言 如果还不了解剧情,请返回第3集的剧情 Java归去来第3集:Eclipse中给动态模块升级 二.在Eclipse中创建Maven类型的SSM项目 2.1:SSM简介 SSM ...
- php ci框架中载入css和js文件失败的原因及解决方法
在将html页面整合到ci框架里面的时候,载入css和js失败. 原因是ci框架是入口的框架 对框架中文件的全部请求都须要经过index.php处理完毕,当载入外部的css和js文件的时候要使 用ba ...
- ShopEx customSchema 定制能够依据客户的需求对站点进行对应功能的加入改动或者删除
站内锚文本制作 1.改动config.php,在文件末尾添加下面内容 define('CUSTOM_CORE_DIR',BASE_DIR . '/custom'); 2.添加custom目录(与cor ...
- maven 上传包
本地 mvn deploy 第三方jar包 mvn deploy:deploy-file -DgroupId=com.zendaimoney.uc -DartifactId=uc-client -Dv ...
- CSS综合(问题)
1.为什么我外层div设置height:auto有效果,而位于这个div里面的一个div设置height:auto就没效果啦? 将三个DIV的高度都设置为自动,overflow:auto;, ...
- Unity3d 屏幕截图。并保存。iOS
- ( void ) imageSaved: ( UIImage *) image didFinishSavingWithError:( NSError *)error contextInfo: ( ...