
void traverse(void (visit)(link))的参数是visit,visit是一个指针,这个指针指向一个无返回值(void),有一个link类型参数的函数。
显然print_item就是这样一个函数。
traverse(print_item);把这个函数的地址传给tranverse的参数visit注意函数名代表函数的入口地址,这个就好理解。
是,for(x,y)中参数是指针,也就是传递的地址原先x指向的内容是3, y指向的内容是2 。调用函数中,分别对应形参a,b,当然a,b也是地址。经过地址交换,分别指向另一个数,也就是x指向的内容是3, y指向的内容是2 。
#include <stdioh>
void max_fun(int a[],int n)
{
int max = a[0];
int i = 0;
for (i = 1; i < n; i++)
{
if (a[i] > max)
{
max = a[i];
}
}
printf("max=%d\n", max);
}
int main(void)
{
int a[10];
int i = 0;
for (i = 0; i < 10; i++)
{
scanf("%d", &a[i]); // 输入10个整数
}
max_fun(a,10);
return 0;
}
c语言中指针即地址,地址的传值可以引起参数的变化。
比如:
&x, &y是取这两个变量的地址,他们的作用空间在main函数里。然后函数调用把这两个变量的地址传递到函数myadd中,在函数中的a和b分别是引用地址指向的变量值,等于是取到了x,y本身的值。在myadd中直接 *** 作a可以改变x的值。
通俗来说因为&x,&y表示的是x,y的地址。所以传递的是地址。意思就是说,函数可以通过地址引用变量。
C语言在形参和实参之间传递的不仅是值传递,也包括地址传递的。
细节如下:
C语言函数参数传递包括按值传递和按地址传递两种;
当形式参数是数组、指针时都是使用的按地址传递。
值传递:不管怎么传,原来的实参的值都不会改变。
地址传递,原来的实参的值可能被改变。
打个比方:
值传递就好象你告诉别人你的帐户里有多少钱 帐户里的钱不会改变。
地址传递就好象你告诉别人你的帐户密码 帐户里面的钱可以被改变。
#include<stdioh>
point(char pt)
main()
{char b[4]={'m','n','o','p'},pt=b;
point(pt);
printf("%c\n",pt);
}
point(char p)
{p+=3;
p='F';}//加上这一句就变了
你这种传递是地址传递没错,形参p的值等于实参pt的值,但是你在调用函数里改变形参p的值,并不能改变实参pt的值,因为p和pt是两个不同的变量。
地址传递的目的,不是改变实参的值,而是通过改变p,达到改变pt的目的
之所以能通过改变p,改变pt的值,是因为p=pt,他们代表同一块内存地址。
总之一块内存空间有两个值,一个是地址p=pt=b,一个是存储的数据。
把地址传递给函数,在函数里通过这个地址,就能改变里面存储的数据'm','n','o','p'
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)