关于指针和指针算术
第一次读C++ primer plus 第六版时,关于指针的语法一些名词没有用心去理解,再读的时候,讲到指针算术这个词时,感觉之前读像是漏了很关键的点,这次读,写下关于指针算术的思考。
有漏了的感觉是,在进行指针变量自加,自减的时候,总是分不清是移动一个数组元素的距离还是移动整个数组的长度。
指针变量自加1,增加的量等于指针指向的类型的字节数。(这里就会说,指针指向的是数组,数组是复合类型,那么它移动的是不是整个数组的长度?其实不是,指是的它指向的具体元素的类型。其实这也说明,每个人对同一句话的不同理解,这就是导致混乱的原因。)
指针指向的是具体的元素,它没有数组的概念,眼里只有地址。
一般情况下,指针名和数组名是一样的。只在2个地方指针和数组名有区别
1、指针是个变量可以修改值,数组名是个常量,一但定义好,数组名指向的地址就不能修改了。
2、用sizeof计算长度时,指针名计算出来的是指针这个变量自己的长度(这里要理解一下),数组名就是整个数组的长度。
举个例子:
int a[10];
int *pa=a;
siteof(a)会是40;而sizeof(pa)=8;(假如int的长度是4字节。假如存储地址的长度是8字节)
还有一个有意思的事:数组名和对数组名取地址:
打印它们的值。这两个值从数字上看相等,都是数组第一个元素的地址,但意义就有点不一样了。
对数组名取地址,是得到的是整个数组的地址。
这个可能不好理解,但是在自加1到底移动多少字节时,就能体现出差异。
还是上面的例子,
a+1是移动4个字节,而&a+1是移动40个字节。(都是从同一个地址出发,第一个元素的地址)。
一个比较难理解的组合:int (*p)[20]。
这里p到底指向什么?答案是:指向一个数组,这个数组包括20个元素。这里需要点时间理解。和int *p[20]的区别。
int a[20]这个好理解,就是一个数组。int *p = a,这个也好理解,就是指向数组的指针。
难理解是这两个:int *p[20]和int (*p)[20]。
要理解这两个,需要知道优先级。[]的优先级高于*。所以,没有括号的时间p先和[]结合。所以,p是一个数组,数组里的元素是int *类型的指针。
此时,再来理解int (*p)[20]。和int a[20]对比,可知(*p)=a。*p说明p是个指针,对p取值:*p,得到a,a是数组名,数组名是一个地址。说明p里面存储的是指向数组a的址址的地址。好像说的更有点绕了,不知道有没有更生动的例子,总之这种写法,就是*p=a了,用的时候用()括起来用,不会单独使用p。没有实际意义。