1.arr和&arr

代码如下:
浅谈C语言数组和指针
我们都知道,指针的初始化是通过 & 操作符来完成的,如果这样写:

int a = 1;
int *p = a;

那编译的过程中会报一个警告,进行输出的话,会发现指针找不到 a 的值。
浅谈C语言数组和指针

那为什么数组可以不使用 & 操作符呢?

首先,arr是数组名,而数组名就是指向数组第一个元素的指针,即数组名代表了这个数组的首地址。

*p = arr就是直接将 arr 赋值给 p。

同时,数组的地址是数组内第一个元素的地址。

*p1 = &arr 是获取 arr 这个数组的地址,这里获取的地址和上面的方式获取的地址是一样的。可以通过 %p 的输出方式看到。
浅谈C语言数组和指针

2.arr+1

代码如下:
浅谈C语言数组和指针
在char类型中,arr + 1是增加一个字节。
即 数组名 + 1 是增加了数组类型的字节数。
浅谈C语言数组和指针

3.p,*p,*p[ ]和**p

四个概念:
(1)p :指针
(2)*p:指针变量
(3)*p[ ]:指针数组
(4)**p:二级指针(指向指针的指针)

代码如下:
浅谈C语言数组和指针

a 是一个二维数组,有两个元素,每个元素是一个一维数组。
浅谈C语言数组和指针

*p1 [ ] 是一个一维的指针数组,它的本质还是个指针,有两个元素:a 和 a+1
浅谈C语言数组和指针

**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++

代码如下:
浅谈C语言数组和指针
*++p 等同于 *(a + 1)

++*p等同于 a[ i ] + 1

*p++等同于 *a

5.(*p)++ , *(p++)和 *(++p)

括号优先级最高。

(*p)++等同于 *p+1,也就是++*p

*(p++)等同于 *p

*(++p)等同于 *(a + 1)

相关文章:

  • 2021-11-25
  • 2021-12-15
  • 2021-10-25
  • 2021-10-15
  • 2021-07-30
  • 2021-07-08
  • 2021-09-26
  • 2021-11-28
猜你喜欢
  • 2021-12-09
  • 2021-05-12
  • 2021-12-09
  • 2021-05-15
  • 2021-11-06
  • 2021-06-02
  • 2021-12-07
  • 2021-10-15
相关资源
相似解决方案