1、数值名的理解
数值名这个在指针里面就是有讲究的,我们通常使用指针去访问数组时
这样指针p获取的就是数组arr的第一个元素的地址,但其实数组的第一个地址会不会是数组名地址呢?
根据这个我们可以知道,数值名不仅可以是一个地址,而且地址还是数组首元素的地址,又上图可知,数组名的地址,与数组首元素的地址是完全一样的。
其实数值名就是数值首元素地址是对的,但是有两个例外:
1、sizeof的括号里面直接放数组名,里面表示的是整个数组的大小。
2、&(数组名),里面表示的也是取整个数组的地址(虽然地址的数组还是数组的首元素的地址,但还是有区别的)。
那么&(数值名)与数值名之间的地址有什么区别呢?
经过上面的代码,我们可以知道p1,p2,p3里面的地址是完全一样的,可当它们的值都加一时,p1+1,p2+1,这两个地址是相同的,而p3+1的地址却相对于比较大,而p1+1,与p1地址之间相差了四个字节,也就是一个整形,p2同理,而p3+1与p3地址之间相差了36个字节,就是9个整形,九个整形,而数组也刚好是有九个整形元素,也就是说,取出整个数组的地址取加一,跳过的地址就是一个数组了。
2、使用指针去访问数组
经上图可以看出使用指针去访问数组时,p1的地址就是数组arr的首元素的地址,数组名arr与p1是等价的,而既然p1的地址等价于数组首元素的地址,arr[i] 是不是等价于p1[i]呢?
事实证明p1[i]是等价于arr[i]的也可以打印出来
3、数组传参的本质
对于数组传参我们可以通过去观察数组的大小来判断数组传参的本质是什么
又代码可知,发现没有办法得出数组正确的个数,时候我们去看到第71行的代码可以发现,我们函数传参时的的实参是数组arr1的地址,将地址去传参给函数里,而sizeof去计算的大小是数组地址的大小,而不是数组的地址。
当我们去添加第66行的test函数去发现,接受数组地址的形参不仅可以用数组,也可以用指针去接收数组的地址
总结:一维数组传参时,形参的部分可以写成数组形式,也可以写成指针的形式。
4、冒泡排序
这里经过一顿手搓代码,终于写出来冒泡排序,这里面,主要就是传参时的arr[]负责去接收地址。
5、二级指针
指针是用来存放地址的,那么指针是否也有地址呢?是不是也可以设置一个指针来存放这个指针的地址呢?
这时候我们就可以去使用二级指针去存放一级指针的地址了(也就是我们平时所用的指针叫一级指针)
由上面这一段代码可以得到二级指针的具体使用方法也就是,在解引用时多使用一个*号。
6、指针数组
类比一下,整形数组存放的是整形,而字符数组存放的是字符,所以指针数组存放的是指针。
指针数组的类型一般为,例如:int *arr[];
也就是存入数组里面的值是一个int *类型的值,数组里面的每一个元素都是指针,它们都各自指向某一块区域
7、指针数组模拟二维数组
话不多说,先看代码,这里要我说,我觉得这里最难理解可能就是第139行的代码了,明明设置了int* p[3]的形式了,可这139行代码却写了一个二维数组的形式出来,其实我们可以去这样理解,p[i]等价于arr i,也就是i等于等于多少就是指向那个数组,而j下标就是后面数组的下标了。
这是我对指针的一些理解(2),希望大家对指针的理解越来越深刻。