1.arr和&arr
代码如下:
我们都知道,指针的初始化是通过 & 操作符来完成的,如果这样写:
int a = 1;
int *p = a;
那编译的过程中会报一个警告,进行输出的话,会发现指针找不到 a 的值。
那为什么数组可以不使用 & 操作符呢?
首先,arr是数组名,而数组名就是指向数组第一个元素的指针,即数组名代表了这个数组的首地址。
*p = arr就是直接将 arr 赋值给 p。
同时,数组的地址是数组内第一个元素的地址。
*p1 = &arr 是获取 arr 这个数组的地址,这里获取的地址和上面的方式获取的地址是一样的。可以通过 %p 的输出方式看到。
2.arr+1
代码如下:
在char类型中,arr + 1是增加一个字节。
即 数组名 + 1 是增加了数组类型的字节数。
3.p,*p,*p[ ]和**p
四个概念:
(1)p :指针
(2)*p:指针变量
(3)*p[ ]:指针数组
(4)**p:二级指针(指向指针的指针)
代码如下:
a 是一个二维数组,有两个元素,每个元素是一个一维数组。
*p1 [ ] 是一个一维的指针数组,它的本质还是个指针,有两个元素:a 和 a+1
**p2 = p1 将 p1 的第一个元素(也就是 a )的地址传给了 p2 。上面说过,数组名代表这个数组的首地址,所以 a 代表的就是这个数组中第一个一维数组的第一个元素的地址,也就是字母 b 的地址。
那 p1+1 为什么不是 c 而是 f 呢?
p1 是指针数组,本质是指针,但同时它还是个数组。
在数组中,数组名 + 1 是数组的下一个元素,所以 p1 + 1 是 p1 这个数组中的下一个元素,也就是 a + 1 。
而 a + 1 代表 a 这个数组的下一个元素,所以 p1+1 取得的是字母 f 的首地址。
4.*++p,++*p 和 *p++
代码如下:
*++p 等同于 *(a + 1)
++*p等同于 a[ i ] + 1
*p++等同于 *a
5.(*p)++ , *(p++)和 *(++p)
括号优先级最高。
(*p)++等同于 *p+1,也就是++*p
*(p++)等同于 *p
*(++p)等同于 *(a + 1)