1. 数组名的理解
2. 使⽤指针访问数组
3. ⼀维数组传参的本质
4. 冒泡排序
5. ⼆级指针
6. 指针数组
7. 指针数组模拟⼆维数组
1.数组名的理解
我们在上面的图中就可以看见。
这⾥我们使⽤ &arr[0] 的⽅式拿到了数组第⼀个元素的地址,但是其实数组名本来就是地址,⽽且 是数组⾸元素的地址,我们把这两种取出首元素地址的不同的方式来进行打印,可以看见&arr[0]和arr取出来的都是第一个元素的地址,
%p是用来打印地址的。
看看上面的图,我们以前说过的,sizeof可以拿来测量数组的大小,单位是字节,但是细心的你就会发现,arr不也是数组的名字吗,那这里显示的不是第一个数组元素的地址吗,一个整型元素的地址要么是4个字节,要么是8个字节,但是,打印出来的确实是这个数组所占据的字节数,事实上
其实数组名就是数组⾸元素(第⼀个元素)的地址是对的,但是有两个例外:
• sizeof(数组名),sizeof中单独放数组名,这⾥的数组名表⽰整个数组,计算的是整个数组的⼤⼩, 单位是字节
• &数组名,这⾥的数组名表⽰整个数组,取出的是整个数组的地址(整个数组的地址和数组⾸元素 的地址是有区别的)
找一个好学的同学来试一下这个代码,打印出来的结果你就会发现,哎,这三个结果都是一样的,因为前两个都是一样的,都是首元素的地址,最后一个是整个元素的地址,但是我们之前讲过了
数组的地址是由低到高的进行分配的,那么就会取出最小的地址,就是首元素的地址。
接下来我们再来看看这个
我们来看看打印的结果是什么
这⾥我们发现&arr[0]和&arr[0]+1相差4个字节,arr和arr+1相差4个字节,是因为&arr[0]和arr都是 ⾸元素的地址,+1就是跳过⼀个元素。 但是&arr和&arr+1相差40个字节,这就是因为&arr是数组的地址,+1操作是跳过整个数组的。
2. 使⽤指针访问数组
接下来我们尝试使用指针来打印数组的内容
第二种情况中,指针在最后可能会越界,但是没有问题,我们不会使用它。
3. ⼀维数组传参的本质
这就要学习数组传参的本质了,上个⼩节我们学习了:数组名是数组⾸元素的地址;那么在数组传参 的时候,传递的是数组名,也就是说本质上数组传参传递的是数组⾸元素的地址
在上图中我们看见了,如果我们在函数内部进行打印的话,我们是打印不出来的,因为数组传参
我们发现在函数内部是没有正确获得数组的元素个数。
所以函数形参的部分理论上应该使⽤指针变量来接收⾸元素的地址。那么在函数内部我们写 sizeof(arr) 计算的是⼀个地址的⼤⼩(单位字节)⽽不是数组的⼤⼩(单位字节)。正是因为函 数的参数部分是本质是指针,所以在函数内部是没办法求的数组元素个数的
传过来的是第一个元素的地址,那么传参的实质就是指针,传过来的就不是整个数组,那么我们也就并不知道这个数组到底有多少个,元素,那么我们,想要在函数内部打印整个数组元素,我峨嵋你就必须现在main函数内部进行计算,再传过去
4. 冒泡排序
冒泡排序的核⼼思想就是:两两相邻的元素进⾏⽐较。
5. ⼆级指针
这个问题简单
指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪⾥?
指针变量就是用来存放普通变量的地址的,那么什么东西来储存指针变量的地址呢?
这就是二级指针。
我们来看上图,a是一个普通变量,而p是为了存放普通变量a的指针变量,而pp为了存放指针变量p的指针变量,pp就是一个二级指针。
*ppa 通过对ppa中的地址进⾏解引⽤,这样找到的是 pa , *ppa 其实访问的就是 pa
6. 指针数组
指针数组是指针还是数组?
我们类⽐⼀下,整型数组,是存放整型的数组,字符数组是存放字符的数组。
那指针数组呢?是存放指针的数组。
7. 指针数组模拟⼆维数组
这张图片中,我们让指针数组的每一个整型指针类型来接收一个数组名,也就是接受一个数组首元素的地址,3个整型元素接收了三个数组首元素的地址,构成了一个二维数组。
标签:arr,元素,数组名,地址,理解,深入,数组,指针 From: https://blog.csdn.net/daiwoliyunshang/article/details/143463400