目录
前言
刚刚接触指针,一直想搞明白数组首地址,数组元素首地址,数组名的区别,花了点时间还是搞懂了!
一、什么是指针?
其实指针就是地址,地址就是指针,简单来说,而指针变量就用来存储地址的变量
这里我就简单的引用菜鸟教程的一张图来说明
当然指针变量的的类型也有很多,int float double。。。 等等
可以通过一个示例来了解一下
定义了一个int 型的变量和int 型指针变量, p =&a;的意思是指针变量p中存储的是a在内存中的地址,*p =a; 则表示则通过地址来获取a的值,所以输出10,而这个&p呢就是表示获取指针p的地址,是的一个存放地址的指针变量也是有地址的,而这个地址也是可以输出的
这只是指针的简单应用而已。
二、正式介绍
1.数组名和数组首元素地址
c语言中数组名的值其实和数组首元素的地址的值是相同的 ,也就是说arr是数组首元素的首地址(和&array[0]一样)
arr这个名字其实就暗含了是一个地址,所以你可以看到第十行我在获取数组首元素地址时没有用到&取地址符号,直接就可以复制给一个指针变量
你也可以看到,pp储存的是arr的值,而pp1存储的是&arr[0]的地址值,两者的值是相等的
而且你也可以看到我将p+1的值和pp2的值也是相同的,而pp2存储的是数组元素中的第二个元素的地址值,所以可以印证数组名就是数组首元素的地址,他们两者之间的值至少是相同的,更深入的我暂时还没有去深入的了解,有大佬直到可以告诉我一下!
2.arr和&arr的区别
示例程序:
还是这个,可以看到&arr和arr和&arr[0]的值是相同的至少,但是虽然值是相同的,但是意义却不同
arr数组名代表了数组首元素的地址和&arr[0] 是相同的
但是&arr的意思是整个数组的首地址,不是其中某个元素的地址!
不知道你有没有发现我将pp1,也就是数组首元素的地址值+1之后,下个地址值+4,你可能会有疑问了?,明明我加的是 1 ,但是为什么地址值会加 4 呢,其实这里的 1,不是我们理解的 1,他表示将数组首元素的地址在内存中向后移动一位,而int类型的所占字节为 4,所以他移动的是一个int型的字节的长度,此时pp1指向的就不是arr[0]了,而是arr[1]了
但是你有没有发现我将&arr+1后移动的却不是4了呢?
这个地址值之间的差值其实可以算一下,算出来是14 ,有人可能会有疑问了,既然是整个数组的地址,那么我+ 1,移动的应该是20呀(int*5)也就是加20才对,毕竟我将整个数组的地址整体向后移动一位,但是你有没有发现,我这里地址值是用16进制来表示的,所以我的20还需要转换为16进制表示的才行
总结
如果数组首元素的地址是p,那么我这个p+1,就表示数组中首元素向后移动一位,移动的字节数根据具体的数据类型来决定
如果我的数组首地址(也就是整个数组的地址)是p,那么p+1,其实移动的是整个数组的长度,而且还需要考虑到地址的进制表示,如果是16进制的地址,还需要将10进制换算为16进制才行
arr数组名其实暗含了是一个地址,这个地址和数组首元素的地址是相同的,至于,arr和&arr[0]之间的区别我暂时还没有深入了解,有大佬知道的可以告诉我一声
本文作者水平有限,如有错误,还望不吝指正!