指针学习中我们还需要了解一下数组名
对于数组名的理解我们见到过这样的代码
数组名理解
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int* p = &arr[0];
这里我们是想拿到数组首元素的地址但其实数组名就是首元素的地址这里我们写一个代码验证一下
从这段代码中我们可以看出我们使用取地址符号和直接拿数组名打印出来的地址是相同的。
所以这里我们有个重点请大家牢记:
- sizeof(数组名)指的是计算整个数组的大小,单位是字节。
- &数组名表示的是取出整个数组的地址。
- 除此之外,数组名就==首元素地址。
那么有的同学就有疑问了
为什么这里打印的三个地址是相同的呢?那么arr和&arr究竟有什么区别呢?
从这张图可以清晰的看到&arr[0]和&arr[0]+1相差四个字节,arr和arr+1相差四个字节,这是因为%arr[0]和arr都是首元素地址,+1就是跳过一个字节。
但是&arr和&arr+1相差四十个字节,这就是因为&arr是数组的地址,+1操作是针对于数组整个加一。
到这里想必大家已经搞清楚数组的意义了。
既然我们学习的是指针这里我们看一下使用指针访问数组
#include <stdio.h>
int main()
{
int arr[5] = {1, 2, 3, 4, 5};
int *ptr = arr; //指向数组的第一个元素
for(int i = 0; i < 5; i++) {
printf("%d ", *(ptr+i)); //输出数组元素
}
这里我们就是借用的指针访问数组内部元素。
二级指针
指针变量也是变量,那我们指针变量放在哪里呢?这个时候我们就需要二级指针来储存指针变量。
这里有一张巨可爱熊清晰的手绘哈哈哈
这里pp变量就是二级指针,对于⼆级指针的运算有:
*pp 通过对pp中的地址进⾏解引⽤,这样找到的是 p ,*pp 其实访问的就是 p 。
int n = 0;
*pp = &n;//等价于 p = &n;
**pp 先通过 *pp 找到 p ,然后对 p 进⾏解引⽤操作: *p,那找到的是 n 。
**pp = 30;
//等价于*p = 30;
//等价于n = 30;
指针数组
指针数组究竟是指针呢还是数组呢?
我们来类比一下,整型数组是存放整型的数组,字符数组是存放字符的数组,那么指针数组就是存放指针的数组啦。
指针数组中每个元素都是存放指针的
这里就是指针数组的概念图,希望各位同学可以理解,不懂留在评论区!