我用文字解释一下吧,看看能不能清楚,提问的式子我都进行了加粗,希望能看得出来(图的话我觉得给出的图已经可以参考讲述的,可以结合我的文字看看)
创新互联是一家专业提供贡山企业网站建设,专注与成都网站建设、做网站、H5建站、小程序制作等业务。10年已为贡山众多企业、政府机构等服务。创新互联专业网络公司优惠进行中。
这个传递数组名称的函数,输入有两个,一个是数组,一个是数组长度
那么我们知道:如果传递的n是10,数组长度是10的话,它的元素的索引应该是0-9,也就是最大索引是9,n-1所表示的就是索引最大值。
目标是返顺序存放,那么也就意味着应该将第一个元素(索引是0)与最后一个元素(索引是9)进行互换,将第二个元素(索引是1)和倒数第二个元素(索引是8)进行互换......以此类推,直到中间位置也就是索引是4和5进行交换的时候。这个时候的话,4这个截止条件与n的关系是什么呢?4=(n-1)/2,这里不是数学,因为n是整型变量,所以等号右边出来的只会是整数部分。这就是m=(n-1)/2的来源了,也就是设定交换的最后一个元素的索引号。这里你可以拿奇数个元素去试试,也是同样成立的。
根据交换过程,那么也就相应的有了:
i=0时,j=9=10-1-0
i=1时,j=8=10-1-1
...
也就是j=n-1-i这个式子的由来。
知道了左边,其实右边和左边是对应的,只不过左边用的数组的方式,右边使用的指针的方式。
注意右边的i,j声明的是整型的指针,也就是他只能指向一个整型的变量。题目中输入*x就是相当于给定数组头部的位置索引,所以i=x就是相当于让i这个指针指向数组第一个元素。数组就是一系列整型数字连续顺序存储的结果,所以i+1表示的就是i这个元素的下一个元素,也就是数组的第二个元素,因此j=x+n-1表示i这个指针指向到数组第n个元素,也就是数组的末尾了,此时i,j和前面不一样的,是都不再表示数组的索引号,而是都是指向某个数组元素的指针了。
这里还声明了一个p指针,移动了m位,m和上一个定义没有区别,就是找到中间位置和开头位置相差多少个元素,于是p=x+m也就是让p这个指针指向数组中间的元素。
要知道main函数也是由其他的程序调用的。
我们编写的程序,最终是不存在所谓的函数名的,有的只有内存单元地址0xffeedd00.
我们的程序执行时,程序加载到内存,比方说整个程序所占用的内存范围是0xffee0000 ~ 0xffeedd00,这么多。
假设程序有一个小函数fun(),那么它的范围可能是0xffee0000~0xffee00ff。
那么函数fun()的入口地址是多少? 0xffee0000。。
那么函数名fun实际上就是0xffee0000的别称。
你用一个指针指向这个函数,那么你把 指针 = 函数名,实际就是把0xffee0000这个内存单元的地址给指针p。
所以,结论是:
函数名 是 程序在执行时, 函数所占内存单元块的 首地址 的别称。
再学习函数指针的时候,见过这么一个例子:
int func(int x); /* 声明一个函数 */
void (*f) (int x); /* 声明一个函数指针 */
f=func; /* 将func函数的首地址赋给指针f */
赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。
所以 函数名代表函数的入口地址吧